Julia関数をどのようにベンチマークできますか?


11

バックグラウンド

私は自分で機械学習を学び、最近Julia機械学習エコシステムについて掘り下げ始めました。


Pythonのバックグラウンドから来て、TensorflowとOpenCV /のskimage経験があるので、Julia MLライブラリ(Flux / JuliaImages)を対応するものと比較して、実際にCV(任意の)タスクを実行する速度と速度を確認し 、 Juliaを使用するようにします。

私はtimeitこのようなモジュールを使用してPythonで関数を実行するのにかかる時間を取得する方法を知っています:

#Loading an Image using OpenCV

s = """\
img = cv2.imread('sample_image.png', 1)
"""
setup = """\
import timeit
"""
print(str(round((timeit.timeit(stmt = s, setup = setup, number = 1))*1000, 2)) + " ms")
#printing the time taken in ms rounded to 2 digits

適切なライブラリー(この場合はJuliaImages)を使用して、Juliaで同じタスクを実行する関数の実行時間をどのように比較しますか。

ジュリアは時間/ベンチマークに機能/マクロを提供していますか?

回答:


10

using BenchmarkToolsジュリア関数をベンチマークする推奨方法です。かなり時間がかかる何かを計時しているのでない限り、そこからエクスポートされたどちら@benchmarkか、またはより詳細な@btimeマクロを使用してください。これらのマクロの背後にある機構はターゲット関数を何度も評価するため、@time実行速度が遅いもの(ディスクアクセスや非常に時間のかかる計算が含まれる場合など)のベンチマークに役立ちます。

@btimeまたは@benchmark正しく使用することが重要です。これにより、誤解を招く結果を回避できます。通常、1つ以上の引数を取る関数をベンチマークします。ベンチマークを行う場合、すべての引数は外部変数である必要があります:(ベンチマークマクロなし)

x = 1
f(x)
# do not use f(1)

関数は何度も評価されます。関数が評価されるたびに関数の引数が再評価されない$ようにするには、引数として使用される各変数の名前の前にa を付けて、各引数にマークを付ける必要があります。ベンチマークマクロは、これを使用して、ベンチマークプロセスの開始時に変数を1回評価(解決)し、結果をそのまま直接再利用することを示します。

julia> using BenchmarkTools
julia> a = 1/2;
julia> b = 1/4;
julia> c = 1/8;
julia> a, b, c
(0.5, 0.25, 0.125)

julia> function sum_cosines(x, y, z)
         return cos(x) + cos(y) + cos(z)
       end;

julia> @btime sum_cosines($a, $b, $c);  # the `;` suppresses printing the returned value
  11.899 ns (0 allocations: 0 bytes)    # calling the function takes ~12 ns (nanoseconds)
                                        # the function does not allocate any memory
# if we omit the '$', what we see is misleading
julia> @btime sum_cosines(a, b, c);    # the function appears more than twice slower 
 28.441 ns (1 allocation: 16 bytes)    # the function appears to be allocating memory
# @benchmark can be used the same way that @btime is used
julia> @benchmark sum_cosines($a,$b,$c) # do not use a ';' here
BenchmarkTools.Trial:
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     12.111 ns (0.00% GC)
  median time:      12.213 ns (0.00% GC)
  mean time:        12.500 ns (0.00% GC)
  maximum time:     39.741 ns (0.00% GC)
  --------------
  samples:          1500
  evals/sample:     999

調整可能なパラメータがありますが、通常はデフォルト値で十分です。経験豊富な看護師向けのBenchmarkToolsの詳細については、マニュアルを参照してください。


7

Juliaは、コードランタイムのタイミング/ベンチマーク用に2つのマクロを提供します。これらは :

  • @時間
  • @benchmark:外部、インストールPkg.add("BenchmarkTools")

BenchmarkToolsの@benchmarkの使用は非常に簡単で、2つの言語の速度を比較するのに役立ちます。指定@bencharkしたPythonベンチに対して使用する例。

using Images, FileIO, BenchmarkTools

@benchmark img = load("sample_image.png")

出力:

BenchmarkTools.Trial: 
  memory estimate:  3.39 MiB
  allocs estimate:  322
  --------------
  minimum time:     76.631 ms (0.00% GC)
  median time:      105.579 ms (0.00% GC)
  mean time:        110.319 ms (0.41% GC)
  maximum time:     209.470 ms (0.00% GC)
  --------------
  samples:          46
  evals/sample:     1

ここで平均時間を比較するにはsamples、python timeitコードの数値として(46)を入力し、それを同じ数値で割って平均実行時間を取得する必要があります。

print(str(round((timeit.timeit(stmt = s, setup = setup, number = 46)/46)*1000, 2)) + " ms")

このプロセスに従って、JuliaとPythonの両方で関数をベンチマークできます。クリアされた疑いがありますね。


統計的な観点から見ると、@ benchmarkは@timeよりもはるかに優れています。


2
タイミングノイズは主に正であることに注意してください。これは、最小時間の方が多くの場合(常にではない)情報が多いことを意味します。@btimeそして@belapsed最低限の時間を返します。
Fredrik Bagge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.