Update.
[profiler-torch.git] / test-profiler.lua
index b394a33..18677ec 100755 (executable)
 #!/usr/bin/env luajit
 
+--[[
+
+   Written by Francois Fleuret (francois@fleuret.org)
+
+   This is free and unencumbered software released into the public
+   domain.
+
+   Anyone is free to copy, modify, publish, use, compile, sell, or
+   distribute this software, either in source code form or as a
+   compiled binary, for any purpose, commercial or non-commercial, and
+   by any means.
+
+   In jurisdictions that recognize copyright laws, the author or
+   authors of this software dedicate any and all copyright interest in
+   the software to the public domain. We make this dedication for the
+   benefit of the public at large and to the detriment of our heirs
+   and successors. We intend this dedication to be an overt act of
+   relinquishment in perpetuity of all present and future rights to
+   this software under copyright law.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+   CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+   For more information, please refer to <http://unlicense.org/>
+
+]]--
+
 require 'torch'
 require 'nn'
 
 require 'profiler'
 
+-- Create a model
+
+local w, h, fs = 50, 50, 3
+local nhu =  (w - fs + 1) * (h - fs + 1)
+
 local model = nn.Sequential()
-model:add(nn.Linear(1000, 1000))
-model:add(nn.ReLU())
-model:add(nn.Linear(1000, 100))
+   :add(nn.Sequential()
+           :add(nn.SpatialConvolution(1, 1, fs, fs))
+           :add(nn.Reshape(nhu))
+           :add(nn.Linear(nhu, 1000))
+           :add(nn.ReLU())
+       )
+   :add(nn.Linear(1000, 100))
+
+-- Decor it for profiling
+
+profiler.decorate(model)
+print()
 
-profiler.decor(model)
+torch.save('model.t7', model)
+
+-- Create the data and criterion
+
+local input = torch.Tensor(1000, 1, h, w)
+local target = torch.Tensor(input:size(1), 100)
+local criterion = nn.MSECriterion()
+
+local nbSamples = 0
+local modelTime = 0
+local dataTime = 0
+
+-- Loop five times through the data forward and backward
+
+for k = 1, 5 do
+   local t1 = sys.clock()
+
+   input:uniform(-1, 1)
+   target:uniform()
+
+   local t2 = sys.clock()
 
-for k = 1, 10 do
-   local input = torch.Tensor(1000, 1000):uniform(-1, 1)
-   local target = torch.Tensor(input:size(1), 100):uniform()
-   local criterion = nn.MSECriterion()
    local output = model:forward(input)
    local loss = criterion:forward(output, target)
    local dloss = criterion:backward(output, target)
    model:backward(input, dloss)
+
+   local t3 = sys.clock()
+
+   dataTime = dataTime + (t2 - t1)
+   modelTime = modelTime + (t3 - t2)
+
+   nbSamples = nbSamples + input:size(1)
 end
 
-profiler.print(model)
+-- Print the accumulated timings
+
+profiler.print(model, nbSamples, modelTime)
+-- profiler.print(model)
+
+print()
+print(string.format('Total model time %.02fs', modelTime))
+print(string.format('Total data time %.02fs', dataTime))