From a8342d073de789f69fda1a2c34d846c73e909623 Mon Sep 17 00:00:00 2001 From: dangqingqing Date: Tue, 18 Oct 2016 12:50:31 +0800 Subject: [PATCH] Add benchmark config and document --- benchmark/README.md | 168 ++ benchmark/caffe/image/alexnet.prototxt | 347 +++ benchmark/caffe/image/googlenet.prototxt | 2334 +++++++++++++++++ benchmark/caffe/image/run.sh | 30 + benchmark/caffe/image/run_multi.sh | 24 + .../caffe/image/smallnet_mnist_cifar.prototxt | 198 ++ benchmark/caffe/image/solver.prototxt | 10 + benchmark/figs/alexnet-4gpu.png | Bin 0 -> 81990 bytes benchmark/figs/googlenet-4gpu.png | Bin 0 -> 82569 bytes benchmark/figs/rnn_lstm_4gpus.png | Bin 0 -> 73243 bytes benchmark/figs/rnn_lstm_cls.png | Bin 0 -> 117634 bytes benchmark/paddle/image/alexnet.py | 57 + benchmark/paddle/image/googlenet.py | 147 ++ benchmark/paddle/image/provider.py | 24 + benchmark/paddle/image/run.sh | 54 + benchmark/paddle/image/run_multi.sh | 42 + .../paddle/image/smallnet_mnist_cifar.py | 47 + benchmark/paddle/rnn/imdb.py | 42 + benchmark/paddle/rnn/provider.py | 64 + benchmark/paddle/rnn/rnn.py | 42 + benchmark/paddle/rnn/run.sh | 38 + benchmark/paddle/rnn/run_multi.sh | 34 + benchmark/tensorflow/image/alexnet.py | 260 ++ .../tensorflow/image/alexnet_multi_gpu.py | 335 +++ benchmark/tensorflow/image/googlenet.py | 282 ++ .../tensorflow/image/googlenet_multi_gpu.py | 381 +++ benchmark/tensorflow/image/run.sh | 28 + benchmark/tensorflow/image/run_multi.sh | 22 + .../tensorflow/image/smallnet_mnist_cifar.py | 273 ++ benchmark/tensorflow/rnn/README.md | 5 + benchmark/tensorflow/rnn/reader.py | 90 + benchmark/tensorflow/rnn/rnn.py | 201 ++ benchmark/tensorflow/rnn/rnn_multi_gpu.py | 306 +++ benchmark/tensorflow/rnn/run.sh | 29 + benchmark/tensorflow/rnn/run_multi.sh | 28 + 35 files changed, 5942 insertions(+) create mode 100644 benchmark/README.md create mode 100644 benchmark/caffe/image/alexnet.prototxt create mode 100644 benchmark/caffe/image/googlenet.prototxt create mode 100755 benchmark/caffe/image/run.sh create mode 100755 benchmark/caffe/image/run_multi.sh create mode 100644 benchmark/caffe/image/smallnet_mnist_cifar.prototxt create mode 100644 benchmark/caffe/image/solver.prototxt create mode 100644 benchmark/figs/alexnet-4gpu.png create mode 100644 benchmark/figs/googlenet-4gpu.png create mode 100644 benchmark/figs/rnn_lstm_4gpus.png create mode 100644 benchmark/figs/rnn_lstm_cls.png create mode 100644 benchmark/paddle/image/alexnet.py create mode 100644 benchmark/paddle/image/googlenet.py create mode 100644 benchmark/paddle/image/provider.py create mode 100755 benchmark/paddle/image/run.sh create mode 100755 benchmark/paddle/image/run_multi.sh create mode 100644 benchmark/paddle/image/smallnet_mnist_cifar.py create mode 100755 benchmark/paddle/rnn/imdb.py create mode 100644 benchmark/paddle/rnn/provider.py create mode 100755 benchmark/paddle/rnn/rnn.py create mode 100755 benchmark/paddle/rnn/run.sh create mode 100755 benchmark/paddle/rnn/run_multi.sh create mode 100644 benchmark/tensorflow/image/alexnet.py create mode 100644 benchmark/tensorflow/image/alexnet_multi_gpu.py create mode 100644 benchmark/tensorflow/image/googlenet.py create mode 100644 benchmark/tensorflow/image/googlenet_multi_gpu.py create mode 100755 benchmark/tensorflow/image/run.sh create mode 100755 benchmark/tensorflow/image/run_multi.sh create mode 100644 benchmark/tensorflow/image/smallnet_mnist_cifar.py create mode 100644 benchmark/tensorflow/rnn/README.md create mode 100755 benchmark/tensorflow/rnn/reader.py create mode 100755 benchmark/tensorflow/rnn/rnn.py create mode 100755 benchmark/tensorflow/rnn/rnn_multi_gpu.py create mode 100755 benchmark/tensorflow/rnn/run.sh create mode 100755 benchmark/tensorflow/rnn/run_multi.sh diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000000..8d2cf5737d --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,168 @@ +# Benchmark + +Machine: + +- CPU: 12-core Intel(R) Xeon(R) CPU E5-2620 v2 @2.10GHz +- GPU: Tesla K40m +- cuDNN: v5.1 +- system: Docker 1.12.1, all platform are tested in docker environment. + +Platform: + +- PaddlePaddle: +- Tensorflow: gcr.io/tensorflow/tensorflow:0.11.0rc0-gpu +- Caffe: + +Several convolutional neural networks and recurrent neural network are used to test. + +## Image + +### Benchmark Model + +AlexNet, GooleNet and a small network which refer the config of cifar10 in Caffe are used. + +- [AlexNet](https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet): but the group size is one. + +- [GoogleNet](https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet): but remove loss1 and loss2 when testing benchmark. + +- [SmallNet](https://github.com/BVLC/caffe/blob/master/examples/cifar10/cifar10\_quick\_train\_test.prototxt) + + +### Singe-GPU + +- AlexNet: input - 3 * 227 * 227, Time: ms/batch + +| BatchSize | 64 | 128 | 256 | 512 | +|--------------|-----| -----| ------| -----| +| PaddlePaddle | 195 | 334 | 602 | 1629 | +| TensorFlow | 223 | 364 | 645 | 1235 | +| Caffe | 324 | 627 | 1232 | 2513 | + +##### Notation + +All platforms use cuDnn-v5.1. You might see that caffe is slower, because the workspace limit size is 8 * 1024 * 1024 in Caffe's cuDnn-conv interface. This size is larger in PaddlePaddle and TensorFlow. Caffe will be faster if increasing the workspace limit size. + +- GoogletNet: input - 3 * 224 * 224, Time: ms/batch + + +| BatchSize | 64 | 128 | 256 | +|--------------|-------| -------| --------| +| PaddlePaddle | 613 | 1149 | 2348 | +| TensorFlow | 644 | 1176 | 2219 | +| Caffe | 694 | 1364 | out of memory | + +- SmallNet: input - 3 * 32 * 32, Time ms/batch + +| BatchSize | 64 | 128 | 256 | 512 | +|--------------|--------| -------- | --------|---------| +| PaddlePaddle | 10.463 | 18.184 | 33.113 | 63.039 | +| TensorFlow | 9 | 15 | 28 | 59 | +| Caffe | 9.373 | 16.6606 | 31.4797 | 59.719 | + +##### Notation + +All the tests in caffe use `caffe time` to execute, which is not including the parameter updating process. But the time in PaddlePaddle and TensorFlow contains it. + +In Tensorflow, they implement algorithm searching method instead of using the algorithm searching interface in cuDNN. + +### Multi-GPU: 4 GPUs + +- AlexNet, ms / batch + +| totoal-BatchSize | 128 * 4 | 256 * 4 | +|------------------|----------| -----------| +| PaddlePaddle | 347 | 622 | +| TensorFlow | 377 | 675 | +| Caffe | 1229 | 2435 | + +For example, if `totoal-BatchSize = 128 * 4`, the speed is calculated by + +``` + time_at_1gpu_batch_128 * 4 / time_at_4gpu_total_batch_512 += (334 * 4)/347 += 3.85 +``` + + + + +- GooleNet, ms / batch + +| totoal-BatchSize | 128 * 4 | 256 * 4 | +|-------------------|--------------| ----------- | +| PaddlePaddle | 1178 | 2367 | +| TensorFlow | 1210 | 2292 | +| Caffe | 2007 | out of memory | + + + + +## RNN +We use lstm network for text classfication to test benchmark. + +### Dataset +- [IMDB](http://www.iro.umontreal.ca/~lisa/deep/data/imdb.pkl) +- Sequence legth=100, in fact, PaddlePaddle support training with variable-length sequence. But TensorFlow need to pad, in order to compare, we also pad sequence length to 100 in PaddlePaddle. +- Dictionary size=30000 +- Peephole connection is used in `lstmemory` by default in PaddlePaddle. It is also configured in TensorFlow. + +### Single GPU + +#### LSTM in Text Classification + +Testing network for different hidden size, batch size with `2 lstm layer + fc` network. + +- Batch size = 64, ms / batch + +| hidden_size | 256 | 512 | 1280 | +|--------------|-------| -------| --------| +| PaddlePaddle | 83 | 184 | 641 | +| TensorFlow | 175 | 280 | 818 | + +- Batch size = 128, ms / batch + +| hidden_size | 256 | 512 | 1280 | +|--------------|------- | -------| --------| +| PaddlePaddle | 110 | 261 | 1007 | +| TensorFlow | 181 | 361 | 1237 | + + +- Batch size = 256, ms / batch + +| hidden_size | 256 | 512 | 1280 | +|--------------|-------| -------| --------| +| PaddlePaddle | 170 | 414 | 1655 | +| TensorFlow | 238 | 536 | 1905 | + + + +#### Seq2Seq + +The benchmark of sequence-to-sequence network will be add later. + + +### Multi GPU: 4 GPUs + +#### LSTM in Text Classification + +- hidden_size = 256, ms / batch + +| batch_size | 256 | 512 | +|--------------| -------| --------| +| PaddlePaddle | 90 | 118 | +| TensorFlow | 226 | 118 | + + +- hidden_size = 512, ms / batch + +| batch_size | 256 | 512 | +|--------------| -------| --------| +| PaddlePaddle | 189 | 268 | +| TensorFlow | 297 | 383 | + + + + +#### Seq2Seq + +The benchmark of sequence-to-sequence network will be add later. diff --git a/benchmark/caffe/image/alexnet.prototxt b/benchmark/caffe/image/alexnet.prototxt new file mode 100644 index 0000000000..aca184ddaf --- /dev/null +++ b/benchmark/caffe/image/alexnet.prototxt @@ -0,0 +1,347 @@ +name: "alexnet" +input: "data" +input_dim: 64 +input_dim: 3 +input_dim: 227 +input_dim: 227 +input: "label" +input_dim: 64 +input_dim: 1 +input_dim: 1 +input_dim: 1 +force_backward: true +layer { + name: "conv1" + type: "Convolution" + bottom: "data" + top: "conv1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu1" + type: "ReLU" + bottom: "conv1" + top: "conv1" +} +layer { + name: "norm1" + type: "LRN" + bottom: "conv1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "pool1" + type: "Pooling" + bottom: "norm1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "conv2" + type: "Convolution" + bottom: "pool1" + top: "conv2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layer { + name: "relu2" + type: "ReLU" + bottom: "conv2" + top: "conv2" +} +layer { + name: "norm2" + type: "LRN" + bottom: "conv2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "pool2" + type: "Pooling" + bottom: "norm2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "conv3" + type: "Convolution" + bottom: "pool2" + top: "conv3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3" + type: "ReLU" + bottom: "conv3" + top: "conv3" +} +layer { + name: "conv4" + type: "Convolution" + bottom: "conv3" + top: "conv4" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layer { + name: "relu4" + type: "ReLU" + bottom: "conv4" + top: "conv4" +} +layer { + name: "conv5" + type: "Convolution" + bottom: "conv4" + top: "conv5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layer { + name: "relu5" + type: "ReLU" + bottom: "conv5" + top: "conv5" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "fc6" + type: "InnerProduct" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "drop6" + type: "Dropout" + bottom: "fc6" + top: "fc6" + dropout_param { + dropout_ratio: 0.5 + } +} +layer { + name: "fc7" + type: "InnerProduct" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 0.1 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "drop7" + type: "Dropout" + bottom: "fc7" + top: "fc7" + dropout_param { + dropout_ratio: 0.5 + } +} +layer { + name: "fc8" + type: "InnerProduct" + bottom: "fc7" + top: "fc8" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 1000 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "loss" + type: "SoftmaxWithLoss" + bottom: "fc8" + bottom: "label" + top: "loss" +} diff --git a/benchmark/caffe/image/googlenet.prototxt b/benchmark/caffe/image/googlenet.prototxt new file mode 100644 index 0000000000..c5f3b4fe3e --- /dev/null +++ b/benchmark/caffe/image/googlenet.prototxt @@ -0,0 +1,2334 @@ +name: "googlenet" +input: "data" +input_dim: 128 +input_dim: 3 +input_dim: 224 +input_dim: 224 +input: "label" +input_dim: 128 +input_dim: 1 +input_dim: 1 +input_dim: 1 +layer { + name: "conv1/7x7_s2" + type: "Convolution" + bottom: "data" + top: "conv1/7x7_s2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv1/relu_7x7" + type: "ReLU" + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" +} +layer { + name: "pool1/3x3_s2" + type: "Pooling" + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +#layer { +# name: "pool1/norm1" +# type: "LRN" +# bottom: "pool1/3x3_s2" +# top: "pool1/norm1" +# lrn_param { +# local_size: 5 +# alpha: 0.0001 +# beta: 0.75 +# } +#} +layer { + name: "conv2/3x3_reduce" + type: "Convolution" +# bottom: "pool1/norm1" + bottom: "pool1/3x3_s2" + top: "conv2/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3_reduce" + type: "ReLU" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" +} +layer { + name: "conv2/3x3" + type: "Convolution" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3" + type: "ReLU" + bottom: "conv2/3x3" + top: "conv2/3x3" +} +#layer { +# name: "conv2/norm2" +# type: "LRN" +# bottom: "conv2/3x3" +# top: "conv2/norm2" +# lrn_param { +# local_size: 5 +# alpha: 0.0001 +# beta: 0.75 +# } +#} +layer { + name: "pool2/3x3_s2" + type: "Pooling" +# bottom: "conv2/norm2" + bottom: "conv2/3x3" + top: "pool2/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_3a/1x1" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_1x1" + type: "ReLU" + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" +} +layer { + name: "inception_3a/3x3_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" +} +layer { + name: "inception_3a/3x3" + type: "Convolution" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3" + type: "ReLU" + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" +} +layer { + name: "inception_3a/5x5_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" +} +layer { + name: "inception_3a/5x5" + type: "Convolution" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5" + type: "ReLU" + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" +} +layer { + name: "inception_3a/pool" + type: "Pooling" + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3a/pool_proj" + type: "Convolution" + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_pool_proj" + type: "ReLU" + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" +} +layer { + name: "inception_3a/output" + type: "Concat" + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" +} +layer { + name: "inception_3b/1x1" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_1x1" + type: "ReLU" + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" +} +layer { + name: "inception_3b/3x3_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" +} +layer { + name: "inception_3b/3x3" + type: "Convolution" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3" + type: "ReLU" + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" +} +layer { + name: "inception_3b/5x5_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" +} +layer { + name: "inception_3b/5x5" + type: "Convolution" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5" + type: "ReLU" + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" +} +layer { + name: "inception_3b/pool" + type: "Pooling" + bottom: "inception_3a/output" + top: "inception_3b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3b/pool_proj" + type: "Convolution" + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_pool_proj" + type: "ReLU" + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" +} +layer { + name: "inception_3b/output" + type: "Concat" + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" +} +layer { + name: "pool3/3x3_s2" + type: "Pooling" + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_4a/1x1" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_1x1" + type: "ReLU" + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" +} +layer { + name: "inception_4a/3x3_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" +} +layer { + name: "inception_4a/3x3" + type: "Convolution" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3" + type: "ReLU" + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" +} +layer { + name: "inception_4a/5x5_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" +} +layer { + name: "inception_4a/5x5" + type: "Convolution" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5" + type: "ReLU" + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" +} +layer { + name: "inception_4a/pool" + type: "Pooling" + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4a/pool_proj" + type: "Convolution" + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_pool_proj" + type: "ReLU" + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" +} +layer { + name: "inception_4a/output" + type: "Concat" + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" +} +#layer { +# name: "loss1/ave_pool" +# type: "Pooling" +# bottom: "inception_4a/output" +# top: "loss1/ave_pool" +# pooling_param { +# pool: AVE +# kernel_size: 5 +# stride: 3 +# } +#} +#layer { +# name: "loss1/conv" +# type: "Convolution" +# bottom: "loss1/ave_pool" +# top: "loss1/conv" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# convolution_param { +# num_output: 128 +# kernel_size: 1 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0.2 +# } +# } +#} +#layer { +# name: "loss1/relu_conv" +# type: "ReLU" +# bottom: "loss1/conv" +# top: "loss1/conv" +#} +#layer { +# name: "loss1/fc" +# type: "InnerProduct" +# bottom: "loss1/conv" +# top: "loss1/fc" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# inner_product_param { +# num_output: 1024 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0.2 +# } +# } +#} +#layer { +# name: "loss1/relu_fc" +# type: "ReLU" +# bottom: "loss1/fc" +# top: "loss1/fc" +#} +#layer { +# name: "loss1/drop_fc" +# type: "Dropout" +# bottom: "loss1/fc" +# top: "loss1/fc" +# dropout_param { +# dropout_ratio: 0.7 +# } +#} +#layer { +# name: "loss1/classifier" +# type: "InnerProduct" +# bottom: "loss1/fc" +# top: "loss1/classifier" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# inner_product_param { +# num_output: 1000 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0 +# } +# } +#} +#layer { +# name: "loss1/loss" +# type: "SoftmaxWithLoss" +# bottom: "loss1/classifier" +# bottom: "label" +# top: "loss1/loss1" +# loss_weight: 0.3 +#} +layer { + name: "inception_4b/1x1" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_1x1" + type: "ReLU" + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" +} +layer { + name: "inception_4b/3x3_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" +} +layer { + name: "inception_4b/3x3" + type: "Convolution" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3" + type: "ReLU" + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" +} +layer { + name: "inception_4b/5x5_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" +} +layer { + name: "inception_4b/5x5" + type: "Convolution" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5" + type: "ReLU" + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" +} +layer { + name: "inception_4b/pool" + type: "Pooling" + bottom: "inception_4a/output" + top: "inception_4b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4b/pool_proj" + type: "Convolution" + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_pool_proj" + type: "ReLU" + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" +} +layer { + name: "inception_4b/output" + type: "Concat" + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" +} +layer { + name: "inception_4c/1x1" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_1x1" + type: "ReLU" + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" +} +layer { + name: "inception_4c/3x3_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" +} +layer { + name: "inception_4c/3x3" + type: "Convolution" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3" + type: "ReLU" + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" +} +layer { + name: "inception_4c/5x5_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" +} +layer { + name: "inception_4c/5x5" + type: "Convolution" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5" + type: "ReLU" + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" +} +layer { + name: "inception_4c/pool" + type: "Pooling" + bottom: "inception_4b/output" + top: "inception_4c/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4c/pool_proj" + type: "Convolution" + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_pool_proj" + type: "ReLU" + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" +} +layer { + name: "inception_4c/output" + type: "Concat" + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" +} +layer { + name: "inception_4d/1x1" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_1x1" + type: "ReLU" + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" +} +layer { + name: "inception_4d/3x3_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" +} +layer { + name: "inception_4d/3x3" + type: "Convolution" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3" + type: "ReLU" + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" +} +layer { + name: "inception_4d/5x5_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" +} +layer { + name: "inception_4d/5x5" + type: "Convolution" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5" + type: "ReLU" + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" +} +layer { + name: "inception_4d/pool" + type: "Pooling" + bottom: "inception_4c/output" + top: "inception_4d/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4d/pool_proj" + type: "Convolution" + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_pool_proj" + type: "ReLU" + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" +} +layer { + name: "inception_4d/output" + type: "Concat" + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" +} +#layer { +# name: "loss2/ave_pool" +# type: "Pooling" +# bottom: "inception_4d/output" +# top: "loss2/ave_pool" +# pooling_param { +# pool: AVE +# kernel_size: 5 +# stride: 3 +# } +#} +#layer { +# name: "loss2/conv" +# type: "Convolution" +# bottom: "loss2/ave_pool" +# top: "loss2/conv" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# convolution_param { +# num_output: 128 +# kernel_size: 1 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0.2 +# } +# } +#} +#layer { +# name: "loss2/relu_conv" +# type: "ReLU" +# bottom: "loss2/conv" +# top: "loss2/conv" +#} +#layer { +# name: "loss2/fc" +# type: "InnerProduct" +# bottom: "loss2/conv" +# top: "loss2/fc" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# inner_product_param { +# num_output: 1024 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0.2 +# } +# } +#} +#layer { +# name: "loss2/relu_fc" +# type: "ReLU" +# bottom: "loss2/fc" +# top: "loss2/fc" +#} +#layer { +# name: "loss2/drop_fc" +# type: "Dropout" +# bottom: "loss2/fc" +# top: "loss2/fc" +# dropout_param { +# dropout_ratio: 0.7 +# } +#} +#layer { +# name: "loss2/classifier" +# type: "InnerProduct" +# bottom: "loss2/fc" +# top: "loss2/classifier" +# param { +# lr_mult: 1 +# decay_mult: 1 +# } +# param { +# lr_mult: 2 +# decay_mult: 0 +# } +# inner_product_param { +# num_output: 1000 +# weight_filler { +# type: "xavier" +# } +# bias_filler { +# type: "constant" +# value: 0 +# } +# } +#} +#layer { +# name: "loss2/loss" +# type: "SoftmaxWithLoss" +# bottom: "loss2/classifier" +# bottom: "label" +# top: "loss2/loss1" +# loss_weight: 0.3 +#} +layer { + name: "inception_4e/1x1" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_1x1" + type: "ReLU" + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" +} +layer { + name: "inception_4e/3x3_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" +} +layer { + name: "inception_4e/3x3" + type: "Convolution" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3" + type: "ReLU" + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" +} +layer { + name: "inception_4e/5x5_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" +} +layer { + name: "inception_4e/5x5" + type: "Convolution" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5" + type: "ReLU" + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" +} +layer { + name: "inception_4e/pool" + type: "Pooling" + bottom: "inception_4d/output" + top: "inception_4e/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4e/pool_proj" + type: "Convolution" + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_pool_proj" + type: "ReLU" + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" +} +layer { + name: "inception_4e/output" + type: "Concat" + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" +} +layer { + name: "pool4/3x3_s2" + type: "Pooling" + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_5a/1x1" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_1x1" + type: "ReLU" + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" +} +layer { + name: "inception_5a/3x3_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" +} +layer { + name: "inception_5a/3x3" + type: "Convolution" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3" + type: "ReLU" + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" +} +layer { + name: "inception_5a/5x5_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" +} +layer { + name: "inception_5a/5x5" + type: "Convolution" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5" + type: "ReLU" + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" +} +layer { + name: "inception_5a/pool" + type: "Pooling" + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5a/pool_proj" + type: "Convolution" + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_pool_proj" + type: "ReLU" + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" +} +layer { + name: "inception_5a/output" + type: "Concat" + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" +} +layer { + name: "inception_5b/1x1" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_1x1" + type: "ReLU" + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" +} +layer { + name: "inception_5b/3x3_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" +} +layer { + name: "inception_5b/3x3" + type: "Convolution" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3" + type: "ReLU" + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" +} +layer { + name: "inception_5b/5x5_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" +} +layer { + name: "inception_5b/5x5" + type: "Convolution" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5" + type: "ReLU" + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" +} +layer { + name: "inception_5b/pool" + type: "Pooling" + bottom: "inception_5a/output" + top: "inception_5b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5b/pool_proj" + type: "Convolution" + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_pool_proj" + type: "ReLU" + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" +} +layer { + name: "inception_5b/output" + type: "Concat" + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" +} +layer { + name: "pool5/7x7_s1" + type: "Pooling" + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layer { + name: "pool5/drop_7x7_s1" + type: "Dropout" + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + dropout_param { + dropout_ratio: 0.4 + } +} +layer { + name: "loss3/classifier" + type: "InnerProduct" + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "loss3/loss3" + type: "SoftmaxWithLoss" + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/loss3" + loss_weight: 1 +} diff --git a/benchmark/caffe/image/run.sh b/benchmark/caffe/image/run.sh new file mode 100755 index 0000000000..aa9ac20ca5 --- /dev/null +++ b/benchmark/caffe/image/run.sh @@ -0,0 +1,30 @@ +set -e + +function test() { + cfg=$1 + batch=$2 + prefix=$3 + sed -i "/input: \"data\"/{n;s/^input_dim.*/input_dim: $batch/g}" $cfg + sed -i "/input: \"label\"/{n;s/^input_dim.*/input_dim: $batch/g}" $cfg + caffe time --model=$cfg --iterations=50 --gpu 0 > logs/$prefix-1gpu-batch${batch}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +# alexnet +test alexnet.prototxt 64 alexnet +test alexnet.prototxt 128 alexnet +test alexnet.prototxt 256 alexnet +test alexnet.prototxt 512 alexnet + +# googlenet +test googlenet.prototxt 64 googlenet +test googlenet.prototxt 128 googlenet + +# small net +test smallnet_mnist_cifar.prototxt 64 smallnet +test smallnet_mnist_cifar.prototxt 128 smallnet +test smallnet_mnist_cifar.prototxt 256 smallnet +test smallnet_mnist_cifar.prototxt 512 smallnet diff --git a/benchmark/caffe/image/run_multi.sh b/benchmark/caffe/image/run_multi.sh new file mode 100755 index 0000000000..f72b062c11 --- /dev/null +++ b/benchmark/caffe/image/run_multi.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -e + +function test() { + cfg=$1 + batch=$2 + prefix=$3 + batch_per_gpu=`expr ${batch} / 4` + sed -i "/input: \"data\"/{n;s/^input_dim.*/input_dim: ${batch_per_gpu}/g}" $cfg + sed -i "/input: \"label\"/{n;s/^input_dim.*/input_dim: ${batch_per_gpu}/g}" $cfg + sed -i "1c\net : \"${cfg}\"" solver.prototxt + caffe train --solver=solver.prototxt -gpu all > logs/${prefix}-4gpu-batch${batch}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +# alexnet +test alexnet.prototxt 512 alexnet +test alexnet.prototxt 1024 alexnet + +# googlnet +test googlenet.prototxt 512 googlenet diff --git a/benchmark/caffe/image/smallnet_mnist_cifar.prototxt b/benchmark/caffe/image/smallnet_mnist_cifar.prototxt new file mode 100644 index 0000000000..3cb0e32bbf --- /dev/null +++ b/benchmark/caffe/image/smallnet_mnist_cifar.prototxt @@ -0,0 +1,198 @@ +name: "mnist/cifar" +input: "data" +input_dim: 128 +input_dim: 3 +input_dim: 32 +input_dim: 32 +input: "label" +input_dim: 128 +input_dim: 1 +input_dim: 1 +input_dim: 1 +layer { + name: "conv1" + type: "Convolution" + bottom: "data" + top: "conv1" + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.0001 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "relu1" + type: "ReLU" + bottom: "pool1" + top: "pool1" +} +layer { + name: "conv2" + type: "Convolution" + bottom: "pool1" + top: "conv2" + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2" + type: "ReLU" + bottom: "conv2" + top: "conv2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2" + top: "pool2" + pooling_param { + pool: AVE + kernel_size: 3 + stride: 2 + } +} +layer { + name: "conv3" + type: "Convolution" + bottom: "pool2" + top: "conv3" + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3" + type: "ReLU" + bottom: "conv3" + top: "conv3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3" + top: "pool3" + pooling_param { + pool: AVE + kernel_size: 3 + stride: 2 + } +} +layer { + name: "ip1" + type: "InnerProduct" + bottom: "pool3" + top: "ip1" + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } + inner_product_param { + num_output: 64 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "ip2" + type: "InnerProduct" + bottom: "ip1" + top: "ip2" + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } + inner_product_param { + num_output: 10 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "accuracy" + type: "Accuracy" + bottom: "ip2" + bottom: "label" + top: "accuracy" + include { + phase: TEST + } +} +layer { + name: "loss" + type: "SoftmaxWithLoss" + bottom: "ip2" + bottom: "label" + top: "loss" +} diff --git a/benchmark/caffe/image/solver.prototxt b/benchmark/caffe/image/solver.prototxt new file mode 100644 index 0000000000..61c10284e6 --- /dev/null +++ b/benchmark/caffe/image/solver.prototxt @@ -0,0 +1,10 @@ +net: "alexnet.prototxt" +base_lr: 0.01 +lr_policy: "fixed" +display: 20 +max_iter: 200 +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "models/caffe_alexnet_train" +solver_mode: GPU diff --git a/benchmark/figs/alexnet-4gpu.png b/benchmark/figs/alexnet-4gpu.png new file mode 100644 index 0000000000000000000000000000000000000000..864c11313d7eacc90910a902c6a3a39c2bef77cc GIT binary patch literal 81990 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 z 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 literal 0 HcmV?d00001 diff --git a/benchmark/figs/googlenet-4gpu.png b/benchmark/figs/googlenet-4gpu.png new file mode 100644 index 0000000000000000000000000000000000000000..098ed35bf7763d34993357501f16b6d859c8733f GIT binary patch literal 82569 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 z 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

o7zPL=7Pd29)iywlrsds!CtZzi8TY3&fc z_mSm!oLHLnLq-~$wz?ci3bJljHir5R-0A!AV^s6narKwLPp1!~_a5GoTd~U(*!%hV zIEf@mK@#73=%GqFS%Ry^`f>`Q*33^h=GAP@LLWs~_BR{6!!-gM!_bt!n>wHBN9rN5 zA|{YjkO&CdTh{<>^0IdOs!?ueT<4gI8oySYo4J$~O{=JHu@~wJ z3bt`Ol8VNM-QkPR>*naUxe6L_p9riTT1Gbzx(%6UrpNQd`kW*cUJ{L6+{;2lq>$(j;-wjeuT5KZDzF4e8#NU zTQ}{3xs*F6>AN>y96u4u?Id4G`B@lr*O2FKcU^mM4LU8AFg!C_aYbca>zJ^z36;Wk zr&$a9cGAsNZHa*~dDkdHU8}xzo$7a?%$F~)*u$&oGTSu%`~RQ%wE!D@CIH*WHd=Nc zgFWPvg=)BYztze`*>wAPzQh(GGrq(#fINtfWn=ZS!t4U=&E-c&j zb2v%9;M~r>hWY%0H4SI-Y3Lo7_s=_(Qmevl+p~*arwPOA3%Z$-lFTAhvYkU0?f%L& zi*fuOw!3#dtns*h1r=%Dp+5O#>9Oqo-h@-74Yn^KN_8zD_@zvmm`>c}if$&$bJmwW z(F4PXLlT5(!P#o08TW2jw??#1DKR$34}eP>o6SGGsOk1y`I7s(sCr78XX|Fg!IYN~ zbae~BS}x=ZD+cbli-;!1lW~VhZaSS!gGoHINtw-vrAeoU z)@5x)s{%w#o`-sDXn(2H;)hl?DtCvUN))hd9(o73suNGP*oy$EEW#5!73wG*;@Q45X=31~N+tdaa>ITs~C zj%wL0PdhDi_!wuwyzmF_#BcgI(X zY9Xl5r&AnW!~C-Kl7v8fVwCt8FJvO$PzQ3HDnce2&=!Vx{{@E}jX?<1ct|${xenf! zFvNl??v7VxEKVXXPDjw&hW+>BNxXoC3Gu|iIWKjA&XoaM;uF0Q6Tj0bagmE80`z4U zA4QZwM8!~>-&GuCiYtR=J<9B?`Z?3we@SAZe|{VKcmgR%vvlK|l>Dbcf*eq$ zfBLK*@>v?>e*MpN{&N)udeBwyyQonVBfP-G0jppWX2;*e{zfMuv*@!^G;rEMXfvd%Z9IBcca- zAU#YJ%AEiGFR!nHrQ^Lr{lDFV7_>-YwlLbL|6UD-2!QJ|DAoS8^#5$C9szJ0{e|1w zH~+mUF8;-o7d(sq|BF|e$&3^vF*#k)4}n%*HyF`yFvYAXcQn5R<`SPrz`8Cj!SsmI zpu~G+fDWe|H=yZkuXwhsTaXk?l`BErB3?3X&`6I7m^U*6^A?vtZ;DseCcL;)Xy z5e9wPewaCS>?O;m;6GQEfE@XVoeX&8zqLY^^G-(#iJ_Gv#xgK4u61d(uw1j)uD2ev zezZgy|H<4s>i3hgs~WX(+f9nzb|gakg8Gh}Rg;CN00;DjDNx|l(M;n;7`!A5$W~8$ z4H^8|)h;BMfqFlAB)!mvD_cE}?6O*dBxbzn)Chh&nC75%v}$}%CoC#D5Qn^a7R&={ zrd|SphjR_g;+uij`I3sP?9327|E4xN{;668k z{>&y1x?9Mg@;-c?lb!Kv)7i0(8u-|G^sO*|q>Mr?q8bAl`eK24> zNey`FX;DAEeDyRgCjSDlohXIR`uXXm9|ff41Y8My zDdm6@*GCMbN?wo{0ZgK_4uOOS(_2>)ul36PAq-eFdQIu&ENCDpk9Pf+K4{-L;l}Fh z29~uU(C7_57Z=p~WKdzFqvA`6>p|TwfA0N_ndrl@qQ%=!hl-|UR1E#Ku1Ho7l!P(l z(5Q6e0Tt>zcNZ%aPk~?t1G)6?^sOW$j2kjRngvt&$v!l0Jt9alj8zl?FkC@~K-082 z-%OhWw>l&mMOfTXX6{tNYc0v*S3H1x`tKCZE1BT6(71#nB4W4-S$lp5Nb9s_80@jy zAVm46y~0@F;P-{odA#$xt?@3?!~^yt@L)%=uWZD!hKIXGvLEz)#6W}2M{k3ofb`ku zhtMu?wwhw#9wqIYGGWtXZ`x!cI7L1Pr=A{6`^|&Ruu8MO0QG}$QoQ;RbQj&;_FdiN z_(8cd=;GY#ir~Y`VG1byq#nl4JbRT&QanKib|!v%1Qd zY=Dg(1B?@<84L0|SwTSI++FHtmjb)Jr-R>kJHmNc{cq+~4-YL7%=vwMZd#{~M*h~w zy&X|pszVe~jt)r5I8scCMXw9*$$5GYMY{l<0*_aE)7RRjT;GAU4PYIO+b%FUy>8dA zH|)+s=`rUVN(o!bMNXcVzWW?4-DUm?G)_p+Id>8T@F|#xLqnxZQzx3w&Ch5e<)C1HggcR72qAKyu}LW9n2CY>Ews=tz5c z8MbuDx}y~+F5sxod%Y*&X8Y|0%pV;)dxC(DMW*s24&j$nzhx4;Z007v=u`)v{#KDE zK@pULc#yELG#rUE|Kdo=Tirb*8OE~7BWy0z@`zKV*F~X z{@+U7HE@dNQrjPWyhY@_qMKIM$l`>+E|T*BM%HD7I?&lUj{6lg7=2oMG5wxVo#5nF z(oDdNw|3CpS_G!uP1YznvDxa|TPs>gywOEWkeOp>c>YtO9tJ#uRQ1EV{0_Fn&dCuC z3&iw2&XER))+x(oWdzti^gz7FNxdFSoA&z4*MC^7-|gd9_F9E2u=>@kMoavfneYNW zk_?(s3-9`-PR6kI2P~S-eyXsu4g(xqXNZL2L4caFLUB^cL%5~4_|+{CNZZ*yje}-@ zok{t98k0^7byDL?o}mAjf!WBh!$l=VTw!`Ap*pxmtLa(PWBIu^VgfleJR{VfbV9)S zWJQGYIaOV?E4F0Ls1P8qpKRAJ%xb4y+pYC?s qDd`bKaTVD8@j4GX6|dj^Y(yF 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 X{(5eQ-H(F>{-`Ny-ubF%8u-5ev@q;@ literal 0 HcmV?d00001 diff --git a/benchmark/figs/rnn_lstm_4gpus.png b/benchmark/figs/rnn_lstm_4gpus.png new file mode 100644 index 0000000000000000000000000000000000000000..973ce2fa5f65e9681c972d4f5bd5776b5c4aa264 GIT binary patch literal 73243 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%0AGXeR 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 H_5J=I8vUTY literal 0 HcmV?d00001 diff --git a/benchmark/figs/rnn_lstm_cls.png b/benchmark/figs/rnn_lstm_cls.png new file mode 100644 index 0000000000000000000000000000000000000000..26d05cac11aa7ae8cdfbcd8c4401f6547a9404f6 GIT binary patch literal 117634 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

  • mxd5FP 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 train.txt + done + fi + + if [ ! -d "train.list" ]; then + echo "train.txt" > train.list + fi +} + +function train() { + cfg=$1 + thread=$2 + bz=$3 + args="batch_size=$3" + prefix=$4 + paddle train --job=time \ + --config=$cfg \ + --use_gpu=True \ + --trainer_count=$thread \ + --log_period=10 \ + --test_period=100 \ + --config_args=$args \ + --cudnn_dir=/home/dangqingqing/tools/cudnn-5.1/lib64 \ + > logs/$prefix-${thread}gpu-$bz.log 2>&1 +} + +gen_file +if [ ! -d "logs" ]; then + mkdir logs +fi + +#========single-gpu=========# +# alexnet +train alexnet.py 1 64 alexnet +train alexnet.py 1 128 alexnet +train alexnet.py 1 256 alexnet +train alexnet.py 1 512 alexnet + +# googlenet +train googlenet.py 1 64 googlenet +train googlenet.py 1 128 googlenet +train googlenet.py 1 256 googlenet + +# smallnet +train smallnet_mnist_cifar.py 1 64 smallnet +train smallnet_mnist_cifar.py 1 128 smallnet +train smallnet_mnist_cifar.py 1 256 smallnet +train smallnet_mnist_cifar.py 1 512 smallnet diff --git a/benchmark/paddle/image/run_multi.sh b/benchmark/paddle/image/run_multi.sh new file mode 100755 index 0000000000..c506668fe0 --- /dev/null +++ b/benchmark/paddle/image/run_multi.sh @@ -0,0 +1,42 @@ +set -e + +function gen_file() { + if [ ! -d "train.txt" ]; then + for ((i=1;i<=1024;i++)) + do + echo "train/n09246464/n09246464_38735.jpeg 972" >> train.txt + done + fi + + if [ ! -d "train.list" ]; then + echo "train.txt" > train.list + fi +} + +function train() { + cfg=$1 + thread=$2 + bz=$3 + args="batch_size=$3" + prefix=$4 + paddle train --job=time \ + --config=$cfg \ + --use_gpu=True \ + --trainer_count=$thread \ + --log_period=10 \ + --test_period=100 \ + --config_args=$args \ + > logs/$prefix-${thread}gpu-$bz.log 2>&1 +} + +gen_file +if [ ! -d "logs" ]; then + mkdir logs +fi + +#========multi-gpus=========# +train alexnet.py 4 512 alexnet +train alexnet.py 4 1024 alexnet + +train googlenet.py 4 512 googlenet +train googlenet.py 4 1024 googlenet diff --git a/benchmark/paddle/image/smallnet_mnist_cifar.py b/benchmark/paddle/image/smallnet_mnist_cifar.py new file mode 100644 index 0000000000..78dba880d2 --- /dev/null +++ b/benchmark/paddle/image/smallnet_mnist_cifar.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +from paddle.trainer_config_helpers import * + +height=32 +width=32 +num_class = 10 + +batch_size = get_config_arg('batch_size', int, 128) + +args={'height':height, 'width':width, 'color':True, 'num_class':num_class} +define_py_data_sources2("train.list", + None, + module="provider", + obj="process", + args=args) + +settings( + batch_size = batch_size, + learning_rate = 0.01 / batch_size, + learning_method = MomentumOptimizer(0.9), + regularization = L2Regularization(0.0005 * batch_size) +) + + +# conv1 +net = data_layer('data', size=height * width * 3) +net = img_conv_layer(input=net, filter_size=5, num_channels=3, + num_filters=32, stride=1, padding=2) +net = img_pool_layer(input=net, pool_size=3, stride=2, padding=1) + +# conv2 +net = img_conv_layer(input=net, filter_size=5, num_filters=32, + stride=1, padding=2) +net = img_pool_layer(input=net, pool_size=3, stride=2, padding=1, pool_type=AvgPooling()) + +# conv3 +net = img_conv_layer(input=net, filter_size=3, num_filters=64, + stride=1, padding=1) +net = img_pool_layer(input=net, pool_size=3, stride=2, padding=1, pool_type=AvgPooling()) + +net = fc_layer(input=net, size=64, act=ReluActivation()) +net = fc_layer(input=net, size=10, act=SoftmaxActivation()) + +lab = data_layer('label', num_class) +loss = classification_cost(input=net, label=lab) +outputs(loss) diff --git a/benchmark/paddle/rnn/imdb.py b/benchmark/paddle/rnn/imdb.py new file mode 100755 index 0000000000..93e1686854 --- /dev/null +++ b/benchmark/paddle/rnn/imdb.py @@ -0,0 +1,42 @@ +from __future__ import print_function +import six.moves.cPickle as pickle +import gzip +import os +import numpy + +def get_dataset_file(dataset, default_dataset, origin): + data_dir, data_file = os.path.split(dataset) + if (not os.path.isfile(dataset)) and data_file == default_dataset: + from six.moves import urllib + print('Downloading data from %s' % origin) + urllib.request.urlretrieve(origin, dataset) + + return dataset + +def create_data(path="imdb.pkl"): + + if (not os.path.isfile('imdb.train.pkl')): + path = get_dataset_file( + path, "imdb.pkl", + "http://www.iro.umontreal.ca/~lisa/deep/data/imdb.pkl") + + if path.endswith(".gz"): + f = gzip.open(path, 'rb') + else: + f = open(path, 'rb') + + train_set = pickle.load(f) + test_set = pickle.load(f) + f.close() + + pickle.dump(train_set, open('imdb.train.pkl', 'wb')) + pickle.dump(test_set, open('imdb.test.pkl', 'wb')) + + if (not os.path.isfile('train.list')): + file('train.list', 'w').write('imdb.train.pkl\n') + +def main(): + create_data('imdb.pkl') + +if __name__ == "__main__": + main() diff --git a/benchmark/paddle/rnn/provider.py b/benchmark/paddle/rnn/provider.py new file mode 100644 index 0000000000..90d3fee676 --- /dev/null +++ b/benchmark/paddle/rnn/provider.py @@ -0,0 +1,64 @@ +import io,os +import random +import numpy as np +import six.moves.cPickle as pickle +from paddle.trainer.PyDataProvider2 import * + +def remove_unk(x, n_words): + return [[1 if w >= n_words else w for w in sen] for sen in x] + +# ============================================================== +# tensorflow uses fixed length, but PaddlePaddle can process +# variable-length. Padding is used in benchmark in order to +# compare with other platform. +# ============================================================== +def pad_sequences(sequences, maxlen=None, dtype='int32', padding='post', + truncating='post', value=0.): + lengths = [len(s) for s in sequences] + + nb_samples = len(sequences) + if maxlen is None: + maxlen = np.max(lengths) + + x = (np.ones((nb_samples, maxlen)) * value).astype(dtype) + for idx, s in enumerate(sequences): + if len(s) == 0: + continue # empty list was found + if truncating == 'pre': + trunc = s[-maxlen:] + elif truncating == 'post': + trunc = s[:maxlen] + else: + raise ValueError("Truncating type '%s' not understood" % padding) + + if padding == 'post': + x[idx, :len(trunc)] = trunc + elif padding == 'pre': + x[idx, -len(trunc):] = trunc + else: + raise ValueError("Padding type '%s' not understood" % padding) + return x + + +def initHook(settings, vocab_size, pad_seq, maxlen, **kwargs): + settings.vocab_size = vocab_size + settings.pad_seq = pad_seq + settings.maxlen = maxlen + settings.input_types = [ + integer_value_sequence(vocab_size), + integer_value(2)] + +@provider(init_hook=initHook, min_pool_size=-1, cache=CacheType.CACHE_PASS_IN_MEM) +def process(settings, file): + f = open(file, 'rb') + train_set = pickle.load(f) + f.close() + x, y = train_set + + # remove unk, namely remove the words out of dictionary + x = remove_unk(x, settings.vocab_size) + if settings.pad_seq: + x = pad_sequences(x, maxlen=settings.maxlen, value=0.) + + for i in range(len(y)): + yield map(int,x[i]), int(y[i]) diff --git a/benchmark/paddle/rnn/rnn.py b/benchmark/paddle/rnn/rnn.py new file mode 100755 index 0000000000..fc8221b112 --- /dev/null +++ b/benchmark/paddle/rnn/rnn.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +from paddle.trainer_config_helpers import * +import imdb + +num_class = 2 +vocab_size = 30000 +fixedlen = 100 +batch_size = get_config_arg('batch_size', int, 128) +lstm_num = get_config_arg('lstm_num', int, 1) +hidden_size = get_config_arg('hidden_size', int, 128) +# whether to pad sequence into fixed length +pad_seq = get_config_arg('pad_seq', bool, True) +imdb.create_data('imdb.pkl') + +args={'vocab_size':vocab_size, 'pad_seq':pad_seq, 'maxlen':fixedlen} +define_py_data_sources2("train.list", + None, + module="provider", + obj="process", + args=args) + +settings( + batch_size=batch_size, + learning_rate=2e-3, + learning_method=AdamOptimizer(), + regularization=L2Regularization(8e-4), + gradient_clipping_threshold=25 +) + +net = data_layer('data', size=vocab_size) +net = embedding_layer(input=net, size=128) + +for i in xrange(lstm_num): + net = simple_lstm(input=net, size=hidden_size) + +net = last_seq(input=net) +net = fc_layer(input=net, size=2, act=SoftmaxActivation()) + +lab = data_layer('label', num_class) +loss = classification_cost(input=net, label=lab) +outputs(loss) diff --git a/benchmark/paddle/rnn/run.sh b/benchmark/paddle/rnn/run.sh new file mode 100755 index 0000000000..92c6e0b4b4 --- /dev/null +++ b/benchmark/paddle/rnn/run.sh @@ -0,0 +1,38 @@ +set -e + +function train() { + cfg=$1 + thread=$2 + args="lstm_num=${3},seq_pad=${4},hidden_size=${5},batch_size=${6}" + paddle train --job=time \ + --config=$cfg \ + --use_gpu=1 \ + --trainer_count=$thread \ + --log_period=10 \ + --test_period=100 \ + --num_passes=1 \ + --feed_data=1 \ + --config_args=$args \ + >logs/rnn-pad${4}-${thread}gpu-lstm${3}-batch${6}-hid${5}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +## padding, single gpu +#-----config--gpu--lstm_num--padding--hidden_size--batch_size +## lstm_num=2, batch_size=64 +train rnn.py 1 2 1 256 64 +train rnn.py 1 2 1 512 64 +train rnn.py 1 2 1 1280 64 + +## lstm_num=2, batch_size=128 +train rnn.py 1 2 1 256 128 +train rnn.py 1 2 1 512 128 +train rnn.py 1 2 1 1280 128 + +## lstm_num=4, batch_size=256 +train rnn.py 1 2 1 256 256 +train rnn.py 1 2 1 512 256 +train rnn.py 1 2 1 1280 256 diff --git a/benchmark/paddle/rnn/run_multi.sh b/benchmark/paddle/rnn/run_multi.sh new file mode 100755 index 0000000000..50ee469bcd --- /dev/null +++ b/benchmark/paddle/rnn/run_multi.sh @@ -0,0 +1,34 @@ +set -e + +function train() { + cfg=$1 + thread=$2 + args="lstm_num=${3},seq_pad=${4},hidden_size=${5},batch_size=${6}" + paddle train --job=time \ + --config=$cfg \ + --use_gpu=1 \ + --trainer_count=$thread \ + --log_period=10 \ + --test_period=100 \ + --num_passes=1 \ + --feed_data=1 \ + --config_args=$args \ + >logs/rnn-pad${4}-${thread}gpu-lstm${3}-hid${5}-batch${6}.log 2>&1 +} + + +if [ ! -d "logs" ]; then + mkdir logs +fi + +#-----config--gpu--lstm_num--padding--hidden_size--batch_size +#==================multi gpus=====================# +# hidden_size=256, lstm_num=2, different batch size +train rnn.py 4 2 1 256 128 +train rnn.py 4 2 1 256 256 +train rnn.py 4 2 1 256 512 + +# hidden_size=512, lstm_num=4, different batch size +train rnn.py 4 2 1 512 128 +train rnn.py 4 2 1 512 256 +train rnn.py 4 2 1 512 512 diff --git a/benchmark/tensorflow/image/alexnet.py b/benchmark/tensorflow/image/alexnet.py new file mode 100644 index 0000000000..57b7ef6c32 --- /dev/null +++ b/benchmark/tensorflow/image/alexnet.py @@ -0,0 +1,260 @@ +from six.moves import xrange # pylint: disable=redefined-builtin +from datetime import datetime +import math +import time + +import tensorflow.python.platform +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 128, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('forward_only', False, + """Only run the forward pass.""") +tf.app.flags.DEFINE_boolean('forward_backward_only', False, + """Only run the forward-forward pass.""") +tf.app.flags.DEFINE_string('data_format', 'NCHW', + """The data format for Convnet operations. + Can be either NHWC or NCHW. + """) +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +def _conv(name, inpOp, nIn, nOut, kH, kW, dH, dW, padType, wd=0.0005): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w',[kH, kW, nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None and wd > 0: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + if FLAGS.data_format == 'NCHW': + strides = [1, 1, dH, dW] + else: + strides = [1, dH, dW, 1] + conv = tf.nn.conv2d(inpOp, kernel, strides, padding=padType, + data_format=FLAGS.data_format) + + biases = tf.get_variable(name=name + '_b', shape=[nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32) + + bias = tf.reshape( + tf.nn.bias_add(conv, biases, data_format=FLAGS.data_format), + conv.get_shape()) + + conv1 = tf.nn.relu(bias, name=scope) + return conv1 + +def _affine(name, inpOp, nIn, nOut, wd=0.0005, act=True, drop=None): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w', [nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None and wd > 0: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + biases = tf.get_variable(name + '_b', [nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32,trainable=True) + + affine1 = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else \ + tf.matmul(inpOp, kernel) + biases + + output = tf.nn.dropout(affine1, drop) if drop else affine1 + + return output + +def _mpool(name, inpOp, kH, kW, dH, dW): + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.max_pool(inpOp, + ksize=ksize, + strides=strides, + padding='VALID', + data_format=FLAGS.data_format, + name=name) + +def _norm(name, l_input, lsize=4): + return tf.nn.lrn(l_input, lsize, bias=1.0, + alpha=0.001 / 9.0, + beta=0.75, name=name) + + + +def loss(logits, labels): + labels = tf.cast(labels, tf.int64) + cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( + logits, labels, name='cross_entropy_per_example') + cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') + tf.add_to_collection('losses', cross_entropy_mean) + + # The total loss is defined as the cross entropy loss plus all of the weight + # decay terms (L2 loss). + return tf.add_n(tf.get_collection('losses'), name='total_loss') + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + +def inference(images): + conv1 = _conv ('conv1', images, 3, 96, 11, 11, 4, 4, 'VALID') + pool1 = _mpool('pool1', conv1, 3, 3, 2, 2) + norm1 = _norm ('norm1', pool1, lsize=5) + conv2 = _conv ('conv2', norm1, 96, 256, 5, 5, 1, 1, 'SAME') + pool2 = _mpool('pool2', conv2, 3, 3, 2, 2) + norm2 = _norm ('norm2', pool2, lsize=5) + conv3 = _conv ('conv3', norm2, 256, 384, 3, 3, 1, 1, 'SAME') + conv4 = _conv ('conv4', conv3, 384, 384, 3, 3, 1, 1, 'SAME') + conv5 = _conv ('conv5', conv4, 384, 256, 3, 3, 1, 1, 'SAME') + pool5 = _mpool('pool5', conv5, 3, 3, 2, 2) + resh1 = tf.reshape(pool5, [-1, 256 * 6 * 6]) + affn1 = _affine('fc6', resh1, 256 * 6 * 6, 4096, 0.5) + affn2 = _affine('fc7', affn1, 4096, 4096, 0.5) + affn3 = _affine('fc8', affn2, 4096, 1000, wd=None, act=False) # last fc + + return affn3 + + +def time_tensorflow_run(session, target, info_string): + num_steps_burn_in = 10 + total_duration = 0.0 + total_duration_squared = 0.0 + if not isinstance(target, list): + target = [target] + target_op = tf.group(*target) + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _ = session.run(target_op) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + print ('%s: step %d, duration = %.3f' % + (datetime.now(), i - num_steps_burn_in, duration)) + total_duration += duration + total_duration_squared += duration * duration + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: %s across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), info_string, FLAGS.num_batches, mn, sd)) + +def _add_loss_summaries(total_loss): + """ + Generates moving average for all losses and associated summaries for + visualizing the performance of the network. + + Args: + total_loss: Total loss from loss(). + Returns: + loss_averages_op: op for generating moving averages of losses. + """ + # Compute the moving average of all individual losses and the total loss. + loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') + losses = tf.get_collection('losses') + loss_averages_op = loss_averages.apply(losses + [total_loss]) + + # Attach a scalar summary to all individual losses and the total loss; do the + # same for the averaged version of the losses. + for l in losses + [total_loss]: + # Name each loss as '(raw)' and name the moving average version of the loss + # as the original loss name. + tf.scalar_summary(l.op.name +' (raw)', l) + tf.scalar_summary(l.op.name, loss_averages.average(l)) + + return loss_averages_op + + + +def run_benchmark(): + with tf.Graph().as_default(): + with tf.device('/gpu:0'): + # Generate some dummy images. + image_size = 224 + # Note that our padding definition is slightly different the cuda-convnet. + # In order to force the model to start with the same activations sizes, + # we add 3 to the image_size and employ VALID padding above. + if FLAGS.data_format == 'NCHW': + image_shape = [FLAGS.batch_size, 3, image_size + 3, image_size + 3] + else: + image_shape = [FLAGS.batch_size, image_size + 3, image_size + 3, 3] + images = tf.get_variable('image', image_shape, + initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), + dtype=tf.float32, + trainable=False) + + labels = tf.get_variable('label', [FLAGS.batch_size], + initializer=tf.constant_initializer(1), + dtype=tf.int32, + trainable=False) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(images) + + objective = loss(last_layer, labels) + # Compute the gradient with respect to all the parameters. + + # Compute gradients. + # opt = tf.train.GradientDescentOptimizer(0.001) + opt = tf.train.MomentumOptimizer(0.001, 0.9) + grads = opt.compute_gradients(objective) + global_step = tf.get_variable('global_step', [], + initializer=tf.constant_initializer(0.0, dtype=tf.float32), + trainable=False, dtype=tf.float32) + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Track the moving averages of all trainable variables. + variable_averages = tf.train.ExponentialMovingAverage( + 0.9, global_step) + variables_averages_op = variable_averages.apply(tf.trainable_variables()) + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + + run_forward = True + run_forward_backward = True + if FLAGS.forward_only and FLAGS.forward_backward_only: + raise ValueError("Cannot specify --forward_only and " + "--forward_backward_only at the same time.") + if FLAGS.forward_only: + run_forward_backward = False + elif FLAGS.forward_backward_only: + run_forward = False + + if run_forward: + time_tensorflow_run(sess, last_layer, "Forward") + + if run_forward_backward: + with tf.control_dependencies([apply_gradient_op, variables_averages_op]): + train_op = tf.no_op(name='train') + time_tensorflow_run(sess, [train_op, objective], "Forward-backward") + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/image/alexnet_multi_gpu.py b/benchmark/tensorflow/image/alexnet_multi_gpu.py new file mode 100644 index 0000000000..949ad77f3b --- /dev/null +++ b/benchmark/tensorflow/image/alexnet_multi_gpu.py @@ -0,0 +1,335 @@ +from six.moves import xrange # pylint: disable=redefined-builtin +from datetime import datetime +import math +import re +import time + +import tensorflow.python.platform +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 64, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_string('data_format', 'NCHW', + """The data format for Convnet operations. + Can be either NHWC or NCHW. + """) + +tf.app.flags.DEFINE_string('train_dir', '/train_model', + """Directory where to write event logs """ + """and checkpoint.""") +tf.app.flags.DEFINE_integer('num_gpus', 4, + """How many GPUs to use.""") +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN=50000 +NUM_EPOCHS_PER_DECAY=50 +INITIAL_LEARNING_RATE = 0.1 +LEARNING_RATE_DECAY_FACTOR = 0.1 +TOWER_NAME = 'tower' + + +def _conv(name, inpOp, nIn, nOut, kH, kW, dH, dW, padType, wd=0.005): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w',[kH, kW, nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + if FLAGS.data_format == 'NCHW': + strides = [1, 1, dH, dW] + else: + strides = [1, dH, dW, 1] + conv = tf.nn.conv2d(inpOp, kernel, strides, padding=padType, + data_format=FLAGS.data_format) + + biases = tf.get_variable(name=name + '_b', shape=[nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32) + + bias = tf.reshape( + tf.nn.bias_add(conv, biases, data_format=FLAGS.data_format), + conv.get_shape()) + + conv1 = tf.nn.relu(bias, name=scope) + return conv1 + +def _affine(name, inpOp, nIn, nOut, wd=0.005, act=True): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w', [nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + biases = tf.get_variable(name + '_b', [nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32,trainable=True) + + affine1 = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else \ + tf.matmul(inpOp, kernel) + biases + + return affine1 + +def _mpool(name, inpOp, kH, kW, dH, dW): + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.max_pool(inpOp, + ksize=ksize, + strides=strides, + padding='VALID', + data_format=FLAGS.data_format, + name=name) + +def _norm(name, l_input, lsize=4): + return tf.nn.lrn(l_input, lsize, bias=1.0, + alpha=0.001 / 9.0, + beta=0.75, name=name) + +def loss(logits, labels): + labels = tf.cast(labels, tf.int64) + cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( + logits, labels, name='cross_entropy_per_example') + cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') + tf.add_to_collection('losses', cross_entropy_mean) + + # The total loss is defined as the cross entropy loss plus all of the weight + # decay terms (L2 loss). + return tf.add_n(tf.get_collection('losses'), name='total_loss') + + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + +def inference(images): + conv1 = _conv ('conv1', images, 3, 96, 11, 11, 4, 4, 'VALID') + pool1 = _mpool('pool1', conv1, 3, 3, 2, 2) + norm1 = _norm ('norm1', pool1, lsize=5) + conv2 = _conv ('conv2', norm1, 96, 256, 5, 5, 1, 1, 'SAME') + pool2 = _mpool('pool2', conv2, 3, 3, 2, 2) + norm2 = _norm ('norm2', pool2, lsize=5) + conv3 = _conv ('conv3', norm2, 256, 384, 3, 3, 1, 1, 'SAME') + conv4 = _conv ('conv4', conv3, 384, 384, 3, 3, 1, 1, 'SAME') + conv5 = _conv ('conv5', conv4, 384, 256, 3, 3, 1, 1, 'SAME') + pool5 = _mpool('pool5', conv5, 3, 3, 2, 2) + resh1 = tf.reshape(pool5, [-1, 256 * 6 * 6]) + affn1 = _affine('fc6', resh1, 256 * 6 * 6, 4096) + affn2 = _affine('fc7', affn1, 4096, 4096) + affn3 = _affine('fc8', affn2, 4096, 1000, wd=None, act=False) # last fc + + return affn3 + +def tower_loss(scope): + """Calculate the total loss on a single tower running the model. + Args: + scope: unique prefix string identifying the tower, e.g. 'tower_0' + Returns: + Tensor of shape [] containing the total loss for a batch of data + """ + image_size = 224 + if FLAGS.data_format == 'NCHW': + image_shape = [FLAGS.batch_size, 3, image_size + 3, image_size + 3] + else: + image_shape = [FLAGS.batch_size, image_size + 3, image_size + 3, 3] + images = tf.get_variable('image', image_shape, + initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), + dtype=tf.float32, + trainable=False) + + labels = tf.get_variable('label', [FLAGS.batch_size], + initializer=tf.constant_initializer(1), + dtype=tf.int32, + trainable=False) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(images) + + # Build the portion of the Graph calculating the losses. Note that we will + # assemble the total_loss using a custom function below. + _ = loss(last_layer, labels) + + # Assemble all of the losses for the current tower only. + losses = tf.get_collection('losses', scope) + + # Calculate the total loss for the current tower. + total_loss = tf.add_n(losses, name='total_loss') + + # Compute the moving average of all individual losses and the total loss. + loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') + loss_averages_op = loss_averages.apply(losses + [total_loss]) + + # Attach a scalar summary to all individual losses and the total loss; do the + # same for the averaged version of the losses. + for l in losses + [total_loss]: + # Remove 'tower_[0-9]/' from the name in case this is a multi-GPU training + # session. This helps the clarity of presentation on tensorboard. + loss_name = re.sub('%s_[0-9]*/' % TOWER_NAME, '', l.op.name) + # Name each loss as '(raw)' and name the moving average version of the loss + # as the original loss name. + tf.scalar_summary(loss_name +' (raw)', l) + tf.scalar_summary(loss_name, loss_averages.average(l)) + + with tf.control_dependencies([loss_averages_op]): + total_loss = tf.identity(total_loss) + return total_loss + + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(0, grads) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + +def time_tensorflow_run(session, target): + num_steps_burn_in = 50 + total_duration = 0.0 + total_duration_squared = 0.0 + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _, loss_value = session.run(target) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + num_examples_per_step = FLAGS.batch_size * FLAGS.num_gpus + examples_per_sec = num_examples_per_step / duration + sec_per_batch = duration + + format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ' + 'sec/batch batch_size = %d)') + print (format_str % + (datetime.now(), i - num_steps_burn_in, + loss_value, duration, sec_per_batch, num_examples_per_step)) + + total_duration += duration + total_duration_squared += duration * duration + + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: FwdBwd across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), FLAGS.num_batches, mn, sd)) + +def run_benchmark(): + with tf.Graph().as_default(), tf.device('/cpu:0'): + # Create a variable to count the number of train() calls. This equals the + # number of batches processed * FLAGS.num_gpus. + global_step = tf.get_variable( + 'global_step', [], + initializer=tf.constant_initializer(0), trainable=False) + + # Calculate the learning rate schedule. + num_batches_per_epoch = (NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / + FLAGS.batch_size) + decay_steps = int(num_batches_per_epoch * NUM_EPOCHS_PER_DECAY) + + # Decay the learning rate exponentially based on the number of steps. + lr = tf.train.exponential_decay(INITIAL_LEARNING_RATE, + global_step, + decay_steps, + LEARNING_RATE_DECAY_FACTOR, + staircase=True) + + # Create an optimizer that performs gradient descent. + # opt = tf.train.GradientDescentOptimizer(lr) + opt = tf.train.MomentumOptimizer(lr, 0.9) + + # Calculate the gradients for each model tower. + tower_grads = [] + for i in xrange(FLAGS.num_gpus): + with tf.device('/gpu:%d' % i): + with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: + # Calculate the loss for one tower of the model. This function + # constructs the entire model but shares the variables across + # all towers. + loss = tower_loss(scope) + + # Reuse variables for the next tower. + tf.get_variable_scope().reuse_variables() + + # Retain the summaries from the final tower. + summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope) + + # Calculate the gradients for the batch of data on this tower. + grads = opt.compute_gradients(loss) + + # Keep track of the gradients across all towers. + tower_grads.append(grads) + + # We must calculate the mean of each gradient. Note that this is the + # synchronization point across all towers. + grads = average_gradients(tower_grads) + + # Apply the gradients to adjust the shared variables. + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Group all updates to into a single train op. + train_op = tf.group(apply_gradient_op) + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. allow_soft_placement must be set to + # True to build towers on GPU, as some of the ops do not have GPU + # implementations. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + time_tensorflow_run(sess, [train_op, loss]) + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/image/googlenet.py b/benchmark/tensorflow/image/googlenet.py new file mode 100644 index 0000000000..097a8997b7 --- /dev/null +++ b/benchmark/tensorflow/image/googlenet.py @@ -0,0 +1,282 @@ +from six.moves import xrange +from datetime import datetime +import math +import time + +import tensorflow.python.platform +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 128, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('forward_only', False, + """Only run the forward pass.""") +tf.app.flags.DEFINE_boolean('forward_backward_only', False, + """Only run the forward-forward pass.""") +tf.app.flags.DEFINE_string('data_format', 'NCHW', + """The data format for Convnet operations. + Can be either NHWC or NCHW. + """) +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +parameters = [] + +conv_counter = 1 +pool_counter = 1 +affine_counter = 1 + +def _conv(inpOp, nIn, nOut, kH, kW, dH, dW, padType, wd = 0.0005): + global conv_counter + global parameters + name = 'conv' + str(conv_counter) + conv_counter += 1 + with tf.name_scope(name) as scope: + kernel = tf.Variable(tf.truncated_normal([kH, kW, nIn, nOut], + dtype=tf.float32, + stddev=1e-1), name='weights') + + if wd is not None and wd > 0: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + if FLAGS.data_format == 'NCHW': + strides = [1, 1, dH, dW] + else: + strides = [1, dH, dW, 1] + conv = tf.nn.conv2d(inpOp, kernel, strides, padding=padType, + data_format=FLAGS.data_format) + biases = tf.Variable(tf.constant(0.0, shape=[nOut], dtype=tf.float32), + trainable=True, name='biases') + bias = tf.reshape(tf.nn.bias_add(conv, biases, + data_format=FLAGS.data_format), + conv.get_shape()) + conv1 = tf.nn.relu(bias, name=scope) + parameters += [kernel, biases] + return conv1 + +def _affine(inpOp, nIn, nOut, act=True, wd = 0.0005): + global affine_counter + global parameters + name = 'affine' + str(affine_counter) + affine_counter += 1 + with tf.name_scope(name) as scope: + kernel = tf.Variable(tf.truncated_normal([nIn, nOut], + dtype=tf.float32, + stddev=1e-1), name='weights') + + if wd is not None and wd > 0: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + biases = tf.Variable(tf.constant(0.0, shape=[nOut], dtype=tf.float32), + trainable=True, name='biases') + affine1 = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else tf.matmul(inpOp, kernel) + biases + parameters += [kernel, biases] + return affine1 + +def _mpool(inpOp, kH, kW, dH, dW, padding): + global pool_counter + global parameters + name = 'pool' + str(pool_counter) + pool_counter += 1 + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.max_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + +def _apool(inpOp, kH, kW, dH, dW, padding): + global pool_counter + global parameters + name = 'pool' + str(pool_counter) + pool_counter += 1 + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.avg_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + +def _inception(inp, inSize, o1s, o2s1, o2s2, o3s1, o3s2, o4s1, o4s2): + conv1 = _conv(inp, inSize, o1s, 1, 1, 1, 1, 'VALID') + + conv3_ = _conv(inp, inSize, o2s1, 1, 1, 1, 1, 'VALID') + conv3 = _conv(conv3_, o2s1, o2s2, 3, 3, 1, 1, 'SAME') + + conv5_ = _conv(inp, inSize, o3s1, 1, 1, 1, 1, 'VALID') + conv5 = _conv(conv5_, o3s1, o3s2, 5, 5, 1, 1, 'SAME') + + pool_ = _mpool(inp, o4s1, o4s1, 1, 1, 'SAME') + pool = _conv(pool_, inSize, o4s2, 1, 1, 1, 1, 'VALID') + + if FLAGS.data_format == 'NCHW': + channel_dim = 1 + else: + channel_dim = 3 + incept = tf.concat(channel_dim, [conv1, conv3, conv5, pool]) + return incept + + +def loss(logits, labels): + batch_size = tf.size(labels) + labels = tf.expand_dims(labels, 1) + indices = tf.expand_dims(tf.range(0, batch_size, 1), 1) + concated = tf.concat(1, [indices, labels]) + onehot_labels = tf.sparse_to_dense( + concated, tf.pack([batch_size, 1000]), 1.0, 0.0) + cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, + onehot_labels, + name='xentropy') + loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') + return loss + +def inference(images): + # stage 1 + conv1 = _conv (images, 3, 64, 7, 7, 2, 2, 'SAME') + pool1 = _mpool(conv1, 3, 3, 2, 2, 'SAME') + # stage 2 + conv2 = _conv (pool1, 64, 64, 1, 1, 1, 1, 'VALID') + conv3 = _conv (conv2, 64, 192, 3, 3, 1, 1, 'SAME') + pool3 = _mpool(conv3, 3, 3, 2, 2, 'SAME') + + # stage 3 + incept3a = _inception(pool3, 192, 64, 96, 128, 16, 32, 3, 32) + incept3b = _inception(incept3a, 256, 128, 128, 192, 32, 96, 3, 64) + pool4 = _mpool(incept3b, 3, 3, 2, 2, 'SAME') + + # stage 4 + incept4a = _inception(pool4, 480, 192, 96, 208, 16, 48, 3, 64) + incept4b = _inception(incept4a, 512, 160, 112, 224, 24, 64, 3, 64) + incept4c = _inception(incept4b, 512, 128, 128, 256, 24, 64, 3, 64) + incept4d = _inception(incept4c, 512, 112, 144, 288, 32, 64, 3, 64) + incept4e = _inception(incept4d, 528, 256, 160, 320, 32, 128, 3, 128) + pool5 = _mpool(incept4e, 3, 3, 2, 2, 'SAME') + + # stage 5 + incept5a = _inception(pool5, 832, 256, 160, 320, 32, 128, 3, 128) + incept5b = _inception(incept5a, 832, 384, 192, 384, 48, 128, 3, 128) + pool6 = _apool(incept5b, 7, 7, 1, 1, 'VALID') + + # output 1 + resh1 = tf.reshape(pool6, [-1, 1024]) + drop = tf.nn.dropout(resh1, 0.4) + affn1 = _affine(resh1, 1024, 1000, act=False) + + return affn1 + + +def time_tensorflow_run(session, target, info_string): + num_steps_burn_in = 10 + total_duration = 0.0 + total_duration_squared = 0.0 + if not isinstance(target, list): + target = [target] + target_op = tf.group(*target) + for i in range(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _ = session.run(target_op) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + print ('%s: step %d, duration = %.3f' % + (datetime.now(), i - num_steps_burn_in, duration)) + total_duration += duration + total_duration_squared += duration * duration + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: %s across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), info_string, FLAGS.num_batches, mn, sd)) + +def run_benchmark(): + global parameters + with tf.Graph().as_default(): + # Generate some dummy images. + image_size = 224 + if FLAGS.data_format == 'NCHW': + image_shape = [FLAGS.batch_size, 3, image_size, image_size] + else: + image_shape = [FLAGS.batch_size, image_size, image_size, 3] + + images = tf.get_variable('image', image_shape, + initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), + dtype=tf.float32, + trainable=False) + + labels = tf.get_variable('label', [FLAGS.batch_size], + initializer=tf.constant_initializer(1), + dtype=tf.int32, + trainable=False) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(images) + + objective = loss(last_layer, labels) + + # Compute gradients. + # opt = tf.train.GradientDescentOptimizer(0.001) + opt = tf.train.MomentumOptimizer(0.001, 0.9) + grads = opt.compute_gradients(objective) + global_step = tf.get_variable('global_step', [], + initializer=tf.constant_initializer(0.0, dtype=tf.float32), + trainable=False, dtype=tf.float32) + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Track the moving averages of all trainable variables. + variable_averages = tf.train.ExponentialMovingAverage( + 0.9, global_step) + variables_averages_op = variable_averages.apply(tf.trainable_variables()) + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + + run_forward = True + run_forward_backward = True + if FLAGS.forward_only and FLAGS.forward_backward_only: + raise ValueError("Cannot specify --forward_only and " + "--forward_backward_only at the same time.") + if FLAGS.forward_only: + run_forward_backward = False + elif FLAGS.forward_backward_only: + run_forward = False + + if run_forward: + # Run the forward benchmark. + time_tensorflow_run(sess, last_layer, "Forward") + + if run_forward_backward: + with tf.control_dependencies([apply_gradient_op, variables_averages_op]): + train_op = tf.no_op(name='train') + time_tensorflow_run(sess, [train_op, objective], "Forward-backward") + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/image/googlenet_multi_gpu.py b/benchmark/tensorflow/image/googlenet_multi_gpu.py new file mode 100644 index 0000000000..e22a6b6253 --- /dev/null +++ b/benchmark/tensorflow/image/googlenet_multi_gpu.py @@ -0,0 +1,381 @@ +from six.moves import xrange # pylint: disable=redefined-builtin +from datetime import datetime +import math +import re +import time + +import tensorflow.python.platform +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 64, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_string('data_format', 'NCHW', + """The data format for Convnet operations. + Can be either NHWC or NCHW. + """) + +tf.app.flags.DEFINE_string('train_dir', '/train_model', + """Directory where to write event logs """ + """and checkpoint.""") +tf.app.flags.DEFINE_integer('num_gpus', 4, + """How many GPUs to use.""") +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN=50000 +NUM_EPOCHS_PER_DECAY=50 +INITIAL_LEARNING_RATE = 0.1 +LEARNING_RATE_DECAY_FACTOR = 0.1 +TOWER_NAME = 'tower' + + +def _conv(name, inpOp, nIn, nOut, kH, kW, dH, dW, padType, wd=0.005): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w',[kH, kW, nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + if FLAGS.data_format == 'NCHW': + strides = [1, 1, dH, dW] + else: + strides = [1, dH, dW, 1] + conv = tf.nn.conv2d(inpOp, kernel, strides, padding=padType, + data_format=FLAGS.data_format) + + biases = tf.get_variable(name=name + '_b', shape=[nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32) + + bias = tf.reshape( + tf.nn.bias_add(conv, biases, data_format=FLAGS.data_format), + conv.get_shape()) + + conv1 = tf.nn.relu(bias, name=scope) + return conv1 + +def _affine(name, inpOp, nIn, nOut, wd=0.005, act=True): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w', [nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + biases = tf.get_variable(name + '_b', [nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32,trainable=True) + + affine1 = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else \ + tf.matmul(inpOp, kernel) + biases + + return affine1 + +def _mpool(name, inpOp, kH, kW, dH, dW, padding): + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.max_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + +def _apool(name, inpOp, kH, kW, dH, dW, padding): + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.avg_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + +def loss(logits, labels): + labels = tf.cast(labels, tf.int64) + cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( + logits, labels, name='cross_entropy_per_example') + cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') + tf.add_to_collection('losses', cross_entropy_mean) + + # The total loss is defined as the cross entropy loss plus all of the weight + # decay terms (L2 loss). + return tf.add_n(tf.get_collection('losses'), name='total_loss') + + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + + +def _inception(name, inp, inSize, o1s, o2s1, o2s2, o3s1, o3s2, o4s1, o4s2): + conv1 = _conv(name + '_1' , inp, inSize, o1s, 1, 1, 1, 1, 'VALID') + + conv3_ = _conv(name + '_3r', inp, inSize, o2s1, 1, 1, 1, 1, 'VALID') + conv3 = _conv(name + '_3', conv3_, o2s1, o2s2, 3, 3, 1, 1, 'SAME') + + conv5_ = _conv(name + '_5r', inp, inSize, o3s1, 1, 1, 1, 1, 'VALID') + conv5 = _conv(name + '5', conv5_, o3s1, o3s2, 5, 5, 1, 1, 'SAME') + + pool_ = _mpool(name + 'pool', inp, o4s1, o4s1, 1, 1, 'SAME') + pool = _conv(name + 'proj', pool_, inSize, o4s2, 1, 1, 1, 1, 'VALID') + + if FLAGS.data_format == 'NCHW': + channel_dim = 1 + else: + channel_dim = 3 + incept = tf.concat(channel_dim, [conv1, conv3, conv5, pool]) + return incept + + +def inference(images): + # stage 1 + conv1 = _conv ('conv1', images, 3, 64, 7, 7, 2, 2, 'SAME') + pool1 = _mpool('pool1', conv1, 3, 3, 2, 2, 'SAME') + + # stage 2 + conv2 = _conv ('conv2', pool1, 64, 64, 1, 1, 1, 1, 'VALID') + conv3 = _conv ('conv3', conv2, 64, 192, 3, 3, 1, 1, 'SAME') + pool3 = _mpool('pool3', conv3, 3, 3, 2, 2, 'SAME') + + # stage 3 + incept3a = _inception('ince3a', pool3, 192, 64, 96, 128, 16, 32, 3, 32) + incept3b = _inception('ince3b', incept3a, 256, 128, 128, 192, 32, 96, 3, 64) + pool4 = _mpool('pool4', incept3b, 3, 3, 2, 2, 'SAME') + + # stage 4 + incept4a = _inception('ince4a', pool4, 480, 192, 96, 208, 16, 48, 3, 64) + incept4b = _inception('ince4b', incept4a, 512, 160, 112, 224, 24, 64, 3, 64) + incept4c = _inception('ince4c', incept4b, 512, 128, 128, 256, 24, 64, 3, 64) + incept4d = _inception('ince4d', incept4c, 512, 112, 144, 288, 32, 64, 3, 64) + incept4e = _inception('ince4e', incept4d, 528, 256, 160, 320, 32, 128, 3, 128) + pool5 = _mpool('pool5', incept4e, 3, 3, 2, 2, 'SAME') + + # stage 5 + incept5a = _inception('ince5a', pool5, 832, 256, 160, 320, 32, 128, 3, 128) + incept5b = _inception('ince5b', incept5a, 832, 384, 192, 384, 48, 128, 3, 128) + pool6 = _apool('pool6', incept5b, 7, 7, 1, 1, 'VALID') + + # output 1 + resh1 = tf.reshape(pool6, [-1, 1024]) + drop = tf.nn.dropout(resh1, 0.4) + affn1 = _affine('fc_out', resh1, 1024, 1000, act=False) + + return affn1 + +def tower_loss(scope): + """Calculate the total loss on a single tower running the model. + Args: + scope: unique prefix string identifying the tower, e.g. 'tower_0' + Returns: + Tensor of shape [] containing the total loss for a batch of data + """ + image_size = 224 + if FLAGS.data_format == 'NCHW': + image_shape = [FLAGS.batch_size, 3, image_size, image_size] + else: + image_shape = [FLAGS.batch_size, image_size, image_size, 3] + images = tf.get_variable('image', image_shape, + initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), + dtype=tf.float32, + trainable=False) + + labels = tf.get_variable('label', [FLAGS.batch_size], + initializer=tf.constant_initializer(1), + dtype=tf.int32, + trainable=False) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(images) + + # Build the portion of the Graph calculating the losses. Note that we will + # assemble the total_loss using a custom function below. + _ = loss(last_layer, labels) + + # Assemble all of the losses for the current tower only. + losses = tf.get_collection('losses', scope) + + # Calculate the total loss for the current tower. + total_loss = tf.add_n(losses, name='total_loss') + + # Compute the moving average of all individual losses and the total loss. + loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') + loss_averages_op = loss_averages.apply(losses + [total_loss]) + + # Attach a scalar summary to all individual losses and the total loss; do the + # same for the averaged version of the losses. + for l in losses + [total_loss]: + # Remove 'tower_[0-9]/' from the name in case this is a multi-GPU training + # session. This helps the clarity of presentation on tensorboard. + loss_name = re.sub('%s_[0-9]*/' % TOWER_NAME, '', l.op.name) + # Name each loss as '(raw)' and name the moving average version of the loss + # as the original loss name. + tf.scalar_summary(loss_name +' (raw)', l) + tf.scalar_summary(loss_name, loss_averages.average(l)) + + with tf.control_dependencies([loss_averages_op]): + total_loss = tf.identity(total_loss) + return total_loss + + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(0, grads) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + +def time_tensorflow_run(session, target): + num_steps_burn_in = 50 + total_duration = 0.0 + total_duration_squared = 0.0 + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _, loss_value = session.run(target) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + num_examples_per_step = FLAGS.batch_size * FLAGS.num_gpus + examples_per_sec = num_examples_per_step / duration + sec_per_batch = duration + + format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ' + 'sec/batch batch_size = %d)') + print (format_str % + (datetime.now(), i - num_steps_burn_in, + loss_value, duration, sec_per_batch, num_examples_per_step)) + + total_duration += duration + total_duration_squared += duration * duration + + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: FwdBwd across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), FLAGS.num_batches, mn, sd)) + +def run_benchmark(): + with tf.Graph().as_default(), tf.device('/cpu:0'): + # Create a variable to count the number of train() calls. This equals the + # number of batches processed * FLAGS.num_gpus. + global_step = tf.get_variable( + 'global_step', [], + initializer=tf.constant_initializer(0), trainable=False) + + # Calculate the learning rate schedule. + num_batches_per_epoch = (NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / + FLAGS.batch_size) + decay_steps = int(num_batches_per_epoch * NUM_EPOCHS_PER_DECAY) + + # Decay the learning rate exponentially based on the number of steps. + lr = tf.train.exponential_decay(INITIAL_LEARNING_RATE, + global_step, + decay_steps, + LEARNING_RATE_DECAY_FACTOR, + staircase=True) + + # Create an optimizer that performs gradient descent. + opt = tf.train.MomentumOptimizer(lr, 0.9) + + # Calculate the gradients for each model tower. + tower_grads = [] + for i in xrange(FLAGS.num_gpus): + with tf.device('/gpu:%d' % i): + with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: + # Calculate the loss for one tower of the model. This function + # constructs the entire model but shares the variables across + # all towers. + loss = tower_loss(scope) + + # Reuse variables for the next tower. + tf.get_variable_scope().reuse_variables() + + # Retain the summaries from the final tower. + summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope) + + # Calculate the gradients for the batch of data on this tower. + grads = opt.compute_gradients(loss) + + # Keep track of the gradients across all towers. + tower_grads.append(grads) + + # We must calculate the mean of each gradient. Note that this is the + # synchronization point across all towers. + grads = average_gradients(tower_grads) + + # Apply the gradients to adjust the shared variables. + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Group all updates to into a single train op. + train_op = tf.group(apply_gradient_op) + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. allow_soft_placement must be set to + # True to build towers on GPU, as some of the ops do not have GPU + # implementations. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + time_tensorflow_run(sess, [train_op, loss]) + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/image/run.sh b/benchmark/tensorflow/image/run.sh new file mode 100755 index 0000000000..eade36beb9 --- /dev/null +++ b/benchmark/tensorflow/image/run.sh @@ -0,0 +1,28 @@ +set -e + +function test() { + cfg=$1 + batch_size=$2 + prefix=$3 + python $cfg --batch_size=$batch_size > logs/${prefix}-1gpu-${batch_size}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +# alexnet +test alexnet.py 64 alexnet +test alexnet.py 128 alexnet +test alexnet.py 256 alexnet +test alexnet.py 512 alexnet + +# googlenet +test googlenet.py 64 googlenet +test googlenet.py 128 googlenet + +# smallnet +test smallnet_mnist_cifar.py 64 smallnet +test smallnet_mnist_cifar.py 128 smallnet +test smallnet_mnist_cifar.py 256 smallnet +test smallnet_mnist_cifar.py 512 smallnet diff --git a/benchmark/tensorflow/image/run_multi.sh b/benchmark/tensorflow/image/run_multi.sh new file mode 100755 index 0000000000..69faa43317 --- /dev/null +++ b/benchmark/tensorflow/image/run_multi.sh @@ -0,0 +1,22 @@ +set -e + +function test() { + cfg=$1 + num_gpu=$2 + batch_size=$3 + batch_per_gpu=`expr ${batch_size} / ${num_gpu}` + prefix=$4 + python $cfg --num_gpus=$num_gpu --batch_size=${batch_per_gpu} > logs/${prefix}-4gpu-${batch_size}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +# alexnet +test alexnet_multi_gpu.py 4 512 alexnet +test alexnet_multi_gpu.py 4 1024 alexnet + +# googlenet +test googlenet_multi_gpu.py 4 512 alexnet +test googlenet_multi_gpu.py 4 1024 alexnet diff --git a/benchmark/tensorflow/image/smallnet_mnist_cifar.py b/benchmark/tensorflow/image/smallnet_mnist_cifar.py new file mode 100644 index 0000000000..b539d1bed0 --- /dev/null +++ b/benchmark/tensorflow/image/smallnet_mnist_cifar.py @@ -0,0 +1,273 @@ +from six.moves import xrange # pylint: disable=redefined-builtin +from datetime import datetime +import math +import time + +import tensorflow.python.platform +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 128, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('forward_only', False, + """Only run the forward pass.""") +tf.app.flags.DEFINE_boolean('forward_backward_only', False, + """Only run the forward-forward pass.""") +tf.app.flags.DEFINE_string('data_format', 'NCHW', + """The data format for Convnet operations. + Can be either NHWC or NCHW. + """) +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +parameters = [] + +conv_counter = 1 +pool_counter = 1 +affine_counter = 1 + +def _conv(inpOp, nIn, nOut, kH, kW, dH, dW, padType, wd=0.005, act=True): + global conv_counter + global parameters + name = 'conv' + str(conv_counter) + conv_counter += 1 + with tf.name_scope(name) as scope: + kernel = tf.Variable(tf.truncated_normal([kH, kW, nIn, nOut], + dtype=tf.float32, + stddev=1e-1), name='weights') + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + if FLAGS.data_format == 'NCHW': + strides = [1, 1, dH, dW] + else: + strides = [1, dH, dW, 1] + conv = tf.nn.conv2d(inpOp, kernel, strides, padding=padType, + data_format=FLAGS.data_format) + biases = tf.Variable(tf.constant(0.0, shape=[nOut], dtype=tf.float32), + trainable=True, name='biases') + bias = tf.reshape(tf.nn.bias_add(conv, biases, + data_format=FLAGS.data_format), + conv.get_shape()) + + conv1 = tf.nn.relu(bias, name=scope) if act else bias + + parameters += [kernel, biases] + + return conv1 + +def _affine(inpOp, nIn, nOut, wd=None, act=True): + global affine_counter + global parameters + name = 'affine' + str(affine_counter) + affine_counter += 1 + with tf.name_scope(name) as scope: + kernel = tf.Variable(tf.truncated_normal([nIn, nOut], + dtype=tf.float32, + stddev=1e-1), name='weights') + + if wd is not None: + weight_decay = tf.mul(tf.nn.l2_loss(kernel), wd, name='weight_loss') + tf.add_to_collection('losses', weight_decay) + + biases = tf.Variable(tf.constant(0.0, shape=[nOut], dtype=tf.float32), + trainable=True, name='biases') + + affine1 = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else tf.matmul(inpOp, kernel) + biases + + parameters += [kernel, biases] + + return affine1 + +def _mpool(inpOp, kH, kW, dH, dW, padding): + global pool_counter + global parameters + name = 'pool' + str(pool_counter) + pool_counter += 1 + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.max_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + + +def _apool(inpOp, kH, kW, dH, dW, padding): + global pool_counter + global parameters + name = 'pool' + str(pool_counter) + pool_counter += 1 + if FLAGS.data_format == 'NCHW': + ksize = [1, 1, kH, kW] + strides = [1, 1, dH, dW] + else: + ksize = [1, kH, kW, 1] + strides = [1, dH, dW, 1] + return tf.nn.avg_pool(inpOp, + ksize=ksize, + strides=strides, + padding=padding, + data_format=FLAGS.data_format, + name=name) + +def _norm(name, l_input, lsize=4): + return tf.nn.lrn(l_input, lsize, bias=1.0, + alpha=0.001 / 9.0, + beta=0.75, name=name) + +def loss(logits, labels): + batch_size = tf.size(labels) + labels = tf.expand_dims(labels, 1) + indices = tf.expand_dims(tf.range(0, batch_size, 1), 1) + concated = tf.concat(1, [indices, labels]) + onehot_labels = tf.sparse_to_dense( + concated, tf.pack([batch_size, 10]), 1.0, 0.0) + cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, + onehot_labels, + name='xentropy') + loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') + return loss + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + +def inference(images): + conv1 = _conv (images, 3, 32, 5, 5, 1, 1, 'SAME') + pool1 = _mpool(conv1, 3, 3, 2, 2, 'SAME') + conv2 = _conv (pool1, 32, 32, 5, 5, 1, 1, 'SAME') + pool2 = _apool(conv2, 3, 3, 2, 2, 'SAME') + conv3 = _conv (pool2, 32, 64, 5, 5, 1, 1, 'SAME') + pool3 = _apool(conv3, 3, 3, 2, 2, 'SAME') + resh1 = tf.reshape(pool3, [-1, 64 * 4 * 4]) + affn1 = _affine(resh1, 64 * 4 * 4, 64) + affn2 = _affine(affn1, 64, 10, act=False) + + print ('conv1:', get_incoming_shape(conv1)) + print ('pool1:', get_incoming_shape(pool1)) + print ('conv2:', get_incoming_shape(conv2)) + print ('pool2:', get_incoming_shape(pool2)) + print ('conv3:', get_incoming_shape(conv3)) + print ('pool3:', get_incoming_shape(pool3)) + + return affn2 + + +def time_tensorflow_run(session, target, info_string): + num_steps_burn_in = 10 + total_duration = 0.0 + total_duration_squared = 0.0 + if not isinstance(target, list): + target = [target] + target_op = tf.group(*target) + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _ = session.run(target_op) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + print ('%s: step %d, duration = %.3f' % + (datetime.now(), i - num_steps_burn_in, duration)) + total_duration += duration + total_duration_squared += duration * duration + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: %s across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), info_string, FLAGS.num_batches, mn, sd)) + +def run_benchmark(): + global parameters + with tf.Graph().as_default(): + # Generate some dummy images. + image_size = 32 + # Note that our padding definition is slightly different the cuda-convnet. + # In order to force the model to start with the same activations sizes, + # we add 3 to the image_size and employ VALID padding above. + if FLAGS.data_format == 'NCHW': + image_shape = [FLAGS.batch_size, 3, image_size, image_size] + else: + image_shape = [FLAGS.batch_size, image_size, image_size, 3] + + images = tf.get_variable('image', image_shape, + initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), + dtype=tf.float32, + trainable=False) + + labels = tf.get_variable('label', [FLAGS.batch_size], + initializer=tf.constant_initializer(1), + dtype=tf.int32, + trainable=False) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(images) + + objective = loss(last_layer, labels) + + # Compute gradients. + # opt = tf.train.GradientDescentOptimizer(0.001) + opt = tf.train.MomentumOptimizer(0.001, 0.9) + grads = opt.compute_gradients(objective) + global_step = tf.get_variable('global_step', [], + initializer=tf.constant_initializer(0.0, dtype=tf.float32), + trainable=False, dtype=tf.float32) + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Track the moving averages of all trainable variables. + variable_averages = tf.train.ExponentialMovingAverage( + 0.9, global_step) + variables_averages_op = variable_averages.apply(tf.trainable_variables()) + + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + + run_forward = True + run_forward_backward = True + if FLAGS.forward_only and FLAGS.forward_backward_only: + raise ValueError("Cannot specify --forward_only and " + "--forward_backward_only at the same time.") + if FLAGS.forward_only: + run_forward_backward = False + elif FLAGS.forward_backward_only: + run_forward = False + + if run_forward: + # Run the forward benchmark. + time_tensorflow_run(sess, last_layer, "Forward") + + if run_forward_backward: + with tf.control_dependencies([apply_gradient_op, variables_averages_op]): + train_op = tf.no_op(name='train') + time_tensorflow_run(sess, [train_op, objective], "Forward-backward") + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/rnn/README.md b/benchmark/tensorflow/rnn/README.md new file mode 100644 index 0000000000..b5314d5446 --- /dev/null +++ b/benchmark/tensorflow/rnn/README.md @@ -0,0 +1,5 @@ +You also should install tflearn: + +```bash +pip install tflearn +``` diff --git a/benchmark/tensorflow/rnn/reader.py b/benchmark/tensorflow/rnn/reader.py new file mode 100755 index 0000000000..0d8308046e --- /dev/null +++ b/benchmark/tensorflow/rnn/reader.py @@ -0,0 +1,90 @@ +import os.path +import io +import numpy as np +import tensorflow as tf + +# tflearn +import tflearn +from tflearn.data_utils import to_categorical, pad_sequences +from tflearn.datasets import imdb + + +FLAGS = tf.app.flags.FLAGS + +class DataSet(object): + def __init__(self, data, labels): + assert data.shape[0] == labels.shape[0], ( + 'data.shape: %s labels.shape: %s' % (data.shape, + labels.shape)) + self._num_examples = data.shape[0] + + self._data = data + self._labels = labels + self._epochs_completed = 0 + self._index_in_epoch = 0 + + @property + def data(self): + return self._data + + @property + def labels(self): + return self._labels + + @property + def num_examples(self): + return self._num_examples + + @property + def epochs_completed(self): + return self._epochs_completed + + def next_batch(self, batch_size): + assert batch_size <= self._num_examples + + start = self._index_in_epoch + self._index_in_epoch += batch_size + if self._index_in_epoch > self._num_examples: + # Finished epoch + self._epochs_completed += 1 + # Shuffle the data + perm = np.arange(self._num_examples) + np.random.shuffle(perm) + self._data = self._data[perm] + self._labels = self._labels[perm] + # Start next epoch + start = 0 + self._index_in_epoch = batch_size + + end = self._index_in_epoch + + return self._data[start:end], self._labels[start:end] + + +def create_datasets(file_path, vocab_size=30000, val_fraction=0.0): + + # IMDB Dataset loading + train, test, _ = imdb.load_data(path=file_path, n_words=vocab_size, + valid_portion=val_fraction, sort_by_len=False) + trainX, trainY = train + testX, testY = test + + # Data preprocessing + # Sequence padding + trainX = pad_sequences(trainX, maxlen=FLAGS.max_len, value=0.) + testX = pad_sequences(testX, maxlen=FLAGS.max_len, value=0.) + # Converting labels to binary vectors + trainY = to_categorical(trainY, nb_classes=2) + testY = to_categorical(testY, nb_classes=2) + + train_dataset = DataSet(trainX, trainY) + + return train_dataset + + +def main(): + create_datasets('imdb.pkl') + + +if __name__ == "__main__": + main() diff --git a/benchmark/tensorflow/rnn/rnn.py b/benchmark/tensorflow/rnn/rnn.py new file mode 100755 index 0000000000..5377187f39 --- /dev/null +++ b/benchmark/tensorflow/rnn/rnn.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +from six.moves import xrange # pylint: disable=redefined-builtin +import math +import time +import numpy as np +from datetime import datetime + +import reader +import tensorflow as tf +from tensorflow.python.ops import rnn + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 128, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('num_layers', 1, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('max_len', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('forward_only', False, + """Only run the forward pass.""") +tf.app.flags.DEFINE_boolean('forward_backward_only', False, + """Only run the forward-forward pass.""") +tf.app.flags.DEFINE_integer('hidden_size', 128, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('emb_size', 128, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") + +VOCAB_SIZE=30000 +NUM_CLASS=2 + +def get_feed_dict(x_data, y_data=None): + feed_dict = {} + + if y_data is not None: + feed_dict[y_input] = y_data + + for i in xrange(x_data.shape[0]): + feed_dict[x_input[i]] = x_data[i, :, :] + + return feed_dict + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + + +# Note input * W is done in LSTMCell, +# which is different from PaddlePaddle +def single_lstm(name, incoming, n_units, use_peepholes=True, + return_seq=False, return_state=False): + with tf.name_scope(name) as scope: + cell = tf.nn.rnn_cell.LSTMCell(n_units, use_peepholes=use_peepholes) + output, _cell_state = rnn.rnn(cell, incoming, dtype=tf.float32) + out = output if return_seq else output[-1] + return (out, _cell_state) if return_state else out + +def lstm(name, incoming, n_units, use_peepholes=True, + return_seq=False, return_state=False, num_layers=1): + with tf.name_scope(name) as scope: + lstm_cell = tf.nn.rnn_cell.LSTMCell(n_units, use_peepholes=use_peepholes) + cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_layers) + initial_state = cell.zero_state(FLAGS.batch_size, dtype=tf.float32) + if not isinstance(incoming, list): + # if the input is embeding, the Tensor shape : [None, time_step, emb_size] + incoming = [tf.squeeze(input_, [1]) + for input_ in tf.split(1, FLAGS.max_len, incoming)] + outputs, state = tf.nn.rnn(cell, incoming, initial_state=initial_state, + dtype=tf.float32) + out = outputs if return_seq else outputs[-1] + return (out, _cell_state) if return_state else out + + +def embedding(name, incoming, vocab_size, emb_size): + with tf.name_scope(name) as scope: + #with tf.device("/cpu:0"): + embedding = tf.get_variable( + name+'_emb', [vocab_size, emb_size], dtype=tf.float32) + out = tf.nn.embedding_lookup(embedding, incoming) + return out + +def fc(name, inpOp, nIn, nOut, act=True): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w', [nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + biases = tf.get_variable(name + '_b', [nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32,trainable=True) + + net = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else \ + tf.matmul(inpOp, kernel) + biases + + return net + +def inference(seq): + net = embedding('emb', seq, VOCAB_SIZE, FLAGS.emb_size) + print "emb:", get_incoming_shape(net) + net = lstm('lstm', net, FLAGS.hidden_size, num_layers=FLAGS.num_layers) + print "lstm:", get_incoming_shape(net) + net = fc('fc1', net, FLAGS.hidden_size, 2) + return net + +def loss(logits, labels): + # one label index for one sample + labels = tf.cast(labels, tf.float32) + cross_entropy = tf.nn.softmax_cross_entropy_with_logits( + logits, labels, name='cross_entropy_per_example') + cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') + tf.add_to_collection('losses', cross_entropy_mean) + return tf.add_n(tf.get_collection('losses'), name='total_loss') + + +def time_tensorflow_run(session, target, x_input, y_input, info_string): + num_steps_burn_in = 50 + total_duration = 0.0 + total_duration_squared = 0.0 + if not isinstance(target, list): + target = [target] + target_op = tf.group(*target) + train_dataset = reader.create_datasets("imdb.pkl", VOCAB_SIZE) + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + data, label = train_dataset.next_batch(FLAGS.batch_size) + _ = session.run(target_op, feed_dict={x_input:data, y_input:label}) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + print ('%s: step %d, duration = %.3f' % + (datetime.now(), i - num_steps_burn_in, duration)) + total_duration += duration + total_duration_squared += duration * duration + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: %s across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), info_string, FLAGS.num_batches, mn, sd)) + + +def run_benchmark(): + with tf.Graph().as_default(): + global_step=0 + with tf.device('/cpu:0'): + global_step = tf.Variable(0, trainable=False) + with tf.device('/gpu:0'): + #x_input = tf.placeholder(tf.int32, [None, FLAGS.max_len], name="x_input") + #y_input = tf.placeholder(tf.int32, [None, NUM_CLASS], name="y_input") + x_input = tf.placeholder(tf.int32, [FLAGS.batch_size, FLAGS.max_len], name="x_input") + y_input = tf.placeholder(tf.int32, [FLAGS.batch_size, NUM_CLASS], name="y_input") + # Generate some dummy sequnce. + + + last_layer = inference(x_input) + + objective = loss(last_layer, y_input) + opt = tf.train.AdamOptimizer(0.001) + grads = opt.compute_gradients(objective) + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + init = tf.initialize_all_variables() + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + + run_forward = True + run_forward_backward = True + if FLAGS.forward_only and FLAGS.forward_backward_only: + raise ValueError("Cannot specify --forward_only and " + "--forward_backward_only at the same time.") + if FLAGS.forward_only: + run_forward_backward = False + elif FLAGS.forward_backward_only: + run_forward = False + + if run_forward: + time_tensorflow_run(sess, last_layer, x_input, y_input, "Forward") + + if run_forward_backward: + with tf.control_dependencies([apply_gradient_op]): + train_op = tf.no_op(name='train') + time_tensorflow_run(sess, [train_op, objective], x_input, y_input, "Forward-backward") + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() + diff --git a/benchmark/tensorflow/rnn/rnn_multi_gpu.py b/benchmark/tensorflow/rnn/rnn_multi_gpu.py new file mode 100755 index 0000000000..97ba5d4c29 --- /dev/null +++ b/benchmark/tensorflow/rnn/rnn_multi_gpu.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python +from six.moves import xrange # pylint: disable=redefined-builtin +import re +import math +import time +import numpy as np +from datetime import datetime + +import reader +import tensorflow as tf +from tensorflow.python.ops import rnn + +FLAGS = tf.app.flags.FLAGS + +tf.app.flags.DEFINE_integer('batch_size', 64, + """Batch size.""") +tf.app.flags.DEFINE_integer('num_batches', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('num_layers', 1, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('max_len', 100, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('hidden_size', 128, + """Number of batches to run.""") +tf.app.flags.DEFINE_integer('emb_size', 64, + """Number of batches to run.""") +tf.app.flags.DEFINE_boolean('log_device_placement', False, + """Whether to log device placement.""") +tf.app.flags.DEFINE_integer('num_gpus', 4, + """How many GPUs to use.""") + +VOCAB_SIZE=30000 +NUM_CLASS=2 + + +NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN=50000 +NUM_EPOCHS_PER_DECAY=50 +INITIAL_LEARNING_RATE = 0.1 +LEARNING_RATE_DECAY_FACTOR = 0.1 +TOWER_NAME = 'tower' + +train_dataset = reader.create_datasets("imdb.pkl", VOCAB_SIZE) + +def get_incoming_shape(incoming): + """ Returns the incoming data shape """ + if isinstance(incoming, tf.Tensor): + return incoming.get_shape().as_list() + elif type(incoming) in [np.array, list, tuple]: + return np.shape(incoming) + else: + raise Exception("Invalid incoming layer.") + + +# Note input * W is done in LSTMCell, +# which is different from PaddlePaddle +def single_lstm(name, incoming, n_units, use_peepholes=True, + return_seq=False, return_state=False): + with tf.name_scope(name) as scope: + cell = tf.nn.rnn_cell.LSTMCell(n_units, use_peepholes=use_peepholes) + output, _cell_state = rnn.rnn(cell, incoming, dtype=tf.float32) + out = output if return_seq else output[-1] + return (out, _cell_state) if return_state else out + + +def lstm(name, incoming, n_units, use_peepholes=True, + return_seq=False, return_state=False, num_layers=1): + with tf.name_scope(name) as scope: + lstm_cell = tf.nn.rnn_cell.LSTMCell(n_units, use_peepholes=use_peepholes) + cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_layers) + initial_state = cell.zero_state(FLAGS.batch_size, dtype=tf.float32) + if not isinstance(incoming, list): + # if the input is embeding, the Tensor shape : [None, time_step, emb_size] + incoming = [tf.squeeze(input_, [1]) + for input_ in tf.split(1, FLAGS.max_len, incoming)] + outputs, state = tf.nn.rnn(cell, incoming, initial_state=initial_state, + dtype=tf.float32) + out = outputs if return_seq else outputs[-1] + return (out, _cell_state) if return_state else out + + +def embedding(name, incoming, vocab_size, emb_size): + with tf.name_scope(name) as scope: + #with tf.device("/cpu:0"): + embedding = tf.get_variable( + name+'_emb', [vocab_size, emb_size], dtype=tf.float32) + out = tf.nn.embedding_lookup(embedding, incoming) + return out + + +def fc(name, inpOp, nIn, nOut, act=True): + with tf.name_scope(name) as scope: + kernel = tf.get_variable(name + '_w', [nIn, nOut], + initializer=tf.truncated_normal_initializer(stddev=0.01, dtype=tf.float32), + dtype=tf.float32) + + biases = tf.get_variable(name + '_b', [nOut], + initializer=tf.constant_initializer(value=0.0, dtype=tf.float32), + dtype=tf.float32,trainable=True) + + net = tf.nn.relu_layer(inpOp, kernel, biases, name=name) if act else \ + tf.matmul(inpOp, kernel) + biases + + return net + + +def inference(seq): + net = embedding('emb', seq, VOCAB_SIZE, FLAGS.emb_size) + print "emb:", get_incoming_shape(net) + net = lstm('lstm', net, FLAGS.hidden_size, num_layers=FLAGS.num_layers) + print "lstm:", get_incoming_shape(net) + net = fc('fc1', net, FLAGS.hidden_size, 2) + return net + + +def loss(logits, labels): + # one label index for one sample + #labels = tf.cast(labels, tf.int64) + # cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( + # logits, labels, name='cross_entropy_per_example') + labels = tf.cast(labels, tf.float32) + cross_entropy = tf.nn.softmax_cross_entropy_with_logits( + logits, labels, name='cross_entropy_per_example') + cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') + tf.add_to_collection('losses', cross_entropy_mean) + return tf.add_n(tf.get_collection('losses'), name='total_loss') + + +def tower_loss(scope): + """Calculate the total loss on a single tower running the model. + Args: + scope: unique prefix string identifying the tower, e.g. 'tower_0' + Returns: + Tensor of shape [] containing the total loss for a batch of data + """ + data, label = train_dataset.next_batch(FLAGS.batch_size) + + # Build a Graph that computes the logits predictions from the + # inference model. + last_layer = inference(data) + + # Build the portion of the Graph calculating the losses. Note that we will + # assemble the total_loss using a custom function below. + #_ = loss(last_layer, label) + _ = loss(last_layer, label) + + # Assemble all of the losses for the current tower only. + losses = tf.get_collection('losses', scope) + + # Calculate the total loss for the current tower. + total_loss = tf.add_n(losses, name='total_loss') + + # Compute the moving average of all individual losses and the total loss. + loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') + loss_averages_op = loss_averages.apply(losses + [total_loss]) + + # Attach a scalar summary to all individual losses and the total loss; do the + # same for the averaged version of the losses. + for l in losses + [total_loss]: + # Remove 'tower_[0-9]/' from the name in case this is a multi-GPU training + # session. This helps the clarity of presentation on tensorboard. + loss_name = re.sub('%s_[0-9]*/' % TOWER_NAME, '', l.op.name) + # Name each loss as '(raw)' and name the moving average version of the loss + # as the original loss name. + tf.scalar_summary(loss_name +' (raw)', l) + #tf.scalar_summary(loss_name, loss_averages.average(l)) + + with tf.control_dependencies([loss_averages_op]): + total_loss = tf.identity(total_loss) + return total_loss + + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(0, grads) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + +def time_tensorflow_run(session, target): + num_steps_burn_in = 80 + total_duration = 0.0 + total_duration_squared = 0.0 + for i in xrange(FLAGS.num_batches + num_steps_burn_in): + start_time = time.time() + _ = session.run(target, feed_dict={x_input:data, y_input:label}) + _, loss_value = session.run(target) + duration = time.time() - start_time + if i > num_steps_burn_in: + if not i % 10: + num_examples_per_step = FLAGS.batch_size * FLAGS.num_gpus + examples_per_sec = num_examples_per_step / duration + # sec_per_batch = duration / FLAGS.num_gpus + sec_per_batch = duration + + format_str = ('%s: step %d, loss= %.2f (%.1f examples/sec; %.3f ' + 'sec/batch batch_size= %d)') + print (format_str % + (datetime.now(), i - num_steps_burn_in, + loss_value, duration, sec_per_batch, num_examples_per_step)) + + total_duration += duration + total_duration_squared += duration * duration + + mn = total_duration / FLAGS.num_batches + vr = total_duration_squared / FLAGS.num_batches - mn * mn + sd = math.sqrt(vr) + print ('%s: FwdBwd across %d steps, %.3f +/- %.3f sec / batch' % + (datetime.now(), FLAGS.num_batches, mn, sd)) + +def run_benchmark(): + with tf.Graph().as_default(), tf.device('/cpu:0'): + # Create a variable to count the number of train() calls. This equals the + # number of batches processed * FLAGS.num_gpus. + global_step = tf.get_variable( + 'global_step', [], + initializer=tf.constant_initializer(0), trainable=False) + + # Calculate the learning rate schedule. + num_batches_per_epoch = (NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / + FLAGS.batch_size) + decay_steps = int(num_batches_per_epoch * NUM_EPOCHS_PER_DECAY) + + # Create an optimizer that performs gradient descent. + opt = tf.train.AdamOptimizer(0.001) + + #train_dataset = reader.create_datasets("imdb.pkl", VOCAB_SIZE) + + # Calculate the gradients for each model tower. + tower_grads = [] + for i in xrange(FLAGS.num_gpus): + with tf.device('/gpu:%d' % i): + with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: + # Calculate the loss for one tower of the model. This function + # constructs the entire model but shares the variables across + # all towers. + loss = tower_loss(scope) + + # Reuse variables for the next tower. + tf.get_variable_scope().reuse_variables() + + # Retain the summaries from the final tower. + # summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope) + + # Calculate the gradients for the batch of data on this tower. + grads = opt.compute_gradients(loss) + + # Keep track of the gradients across all towers. + tower_grads.append(grads) + + # We must calculate the mean of each gradient. Note that this is the + # synchronization point across all towers. + grads = average_gradients(tower_grads) + + # Apply the gradients to adjust the shared variables. + apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) + + # Group all updates to into a single train op. + train_op = tf.group(apply_gradient_op) + + # Build an initialization operation. + init = tf.initialize_all_variables() + + # Start running operations on the Graph. allow_soft_placement must be set to + # True to build towers on GPU, as some of the ops do not have GPU + # implementations. + sess = tf.Session(config=tf.ConfigProto( + allow_soft_placement=True, + log_device_placement=FLAGS.log_device_placement)) + sess.run(init) + time_tensorflow_run(sess, [train_op, loss]) + + +def main(_): + run_benchmark() + + +if __name__ == '__main__': + tf.app.run() diff --git a/benchmark/tensorflow/rnn/run.sh b/benchmark/tensorflow/rnn/run.sh new file mode 100755 index 0000000000..bb4c69cb95 --- /dev/null +++ b/benchmark/tensorflow/rnn/run.sh @@ -0,0 +1,29 @@ +set -e + +function test() { + lstm_num=$1 + batch_size=$2 + hid_size=$3 + prefix=$4 + python rnn.py --num_layers=${lstm_num} --batch_size=$batch_size \ + --hidden_size=${hid_size} \ + --forward_backward_only=1 \ + > logs/1gpu-${lstm_num}lstm-batch${batch_size}-hid${hid_size}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +#--lstm_num--batch_size--hidden_size--# +test 2 64 256 +test 2 64 512 +test 2 64 1280 + +test 2 128 256 +test 2 128 512 +test 2 128 1280 + +test 2 256 256 +test 2 256 512 +test 2 256 1280 diff --git a/benchmark/tensorflow/rnn/run_multi.sh b/benchmark/tensorflow/rnn/run_multi.sh new file mode 100755 index 0000000000..f7f52e01e3 --- /dev/null +++ b/benchmark/tensorflow/rnn/run_multi.sh @@ -0,0 +1,28 @@ +set -e + +function test() { + num_gpu=$1 + lstm_num=$2 + hid_size=$3 + batch_per_gpu=`expr ${batch_size} / ${num_gpu}` + batch_size=$4 + python rnn_multi_gpu.py --num_layers=${lstm_num} --batch_size=$batch_per_gpu \ + --num_gpus=${num_gpu} \ + --hidden_size=${hid_size} \ + --forward_backward_only=1 \ + > logs/${num_gpu}gpu-${lstm_num}lstm-hid${hid_size}-batch${batch_size}.log 2>&1 +} + +if [ ! -d "logs" ]; then + mkdir logs +fi + +#--num_gpus--lstm_num--hiddne_size--batch_size--# +test 4 2 256 128 +test 4 2 256 256 +test 4 2 256 512 + +test 4 2 512 128 +test 4 2 512 256 +test 4 2 512 512 + -- GitLab