Dengan cara apa saya bisa membuat tolok ukur fungsi Julia?

11

Latar Belakang

Saya belajar sendiri tentang pembelajaran mesin dan baru-baru ini mulai mempelajari Julia Machine Learning Ecosystem.


Berasal dari latar belakang python dan memiliki beberapa Tensorflow dan OpenCV / skimagepengalaman, saya ingin membandingkan perpustakaan Julia ML (Flux / JuliaImages) dengan rekan-rekannya untuk melihat seberapa cepat atau lambat itu benar-benar melakukan tugas (apapun) CV dan untuk memutuskan apakah Saya harus beralih menggunakan Julia.

Saya tahu cara mendapatkan waktu yang dibutuhkan untuk menjalankan fungsi dalam python menggunakan timeitmodul seperti ini:

#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

Bagaimana cara membandingkan waktu eksekusi suatu fungsi yang melakukan tugas yang sama di Julia menggunakan pustaka yang sesuai (dalam hal ini, JuliaImages).

Apakah Julia menyediakan fungsi / makro ke waktu / benchmark?

PseudoCodeNerd
sumber

Jawaban:

10

using BenchmarkToolsadalah cara yang disarankan untuk membandingkan fungsi Julia. Kecuali jika Anda menghitung waktu yang cukup lama, gunakan salah satu @benchmarkatau kurang @btimemakro yang diekspor darinya. Karena mesin di balik makro ini mengevaluasi fungsi target berkali-kali, @timeberguna untuk membuat tolok ukur hal-hal yang berjalan lambat (mis. Di mana akses disk atau kalkulasi yang sangat memakan waktu terlibat).

Penting untuk menggunakan @btimeatau @benchmarkdengan benar, ini menghindari hasil yang menyesatkan. Biasanya, Anda membuat tolok ukur fungsi yang membutuhkan satu atau beberapa argumen. Saat membuat tolok ukur, semua argumen harus berupa variabel eksternal: (tanpa makro tolok ukur)

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

Fungsi akan dievaluasi berkali-kali. Untuk mencegah argumen fungsi dievaluasi ulang setiap kali fungsi dievaluasi, kita harus menandai setiap argumen dengan mengawali a $ke nama setiap variabel yang digunakan sebagai argumen. Makro pembandingan menggunakan ini untuk menunjukkan bahwa variabel harus dievaluasi (diselesaikan) satu kali, pada awal proses pembandingan dan kemudian hasilnya akan digunakan kembali secara langsung seperti:

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

Meskipun ada parameter yang dapat disesuaikan, nilai-nilai default biasanya berfungsi dengan baik. Untuk informasi tambahan tentang BenchmarkTools untuk urser berpengalaman, lihat manual .

Jeffrey Sarnoff
sumber
7

Julia menyediakan dua makro untuk runtime kode penetapan waktu / pembandingan. Ini adalah:

  • @waktu
  • @benchmark : eksternal, instal olehPkg.add("BenchmarkTools")

Menggunakan BenchmarkTools '@benchmark sangat mudah dan akan membantu Anda dalam membandingkan kecepatan kedua bahasa. Contoh penggunaan @bencharkterhadap bangku python yang Anda berikan.

using Images, FileIO, BenchmarkTools

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

Keluaran:

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

Sekarang untuk membandingkan waktu rata-rata, Anda harus meletakkan samples(46) sebagai nomor dalam kode python timeit Anda dan membaginya dengan nomor yang sama untuk mendapatkan waktu eksekusi rata-rata.

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

Anda dapat mengikuti proses ini untuk menentukan tolok ukur fungsi apa pun di Julia dan Python. Saya harap Anda ragu telah dihapus.


Catatan : Dari sudut pandang statistik, @benchmark jauh lebih baik daripada @waktu.

PseudoCodeNerd
sumber
2
Perhatikan bahwa noise waktu sebagian besar positif, menyiratkan bahwa waktu minimum seringkali (tidak selalu) lebih informatif. @btimedan @belapsedhanya mengembalikan waktu minimum.
Fredrik Bagge