Julia işlevini hangi yollarla karşılaştırabilirim?


11

Arka fon

Kendime makine öğrenimi öğrettim ve son zamanlarda Julia Machine Learning Ekosistemini araştırmaya başladım.


Bir python arka planından gelip bazı Tensorflow ve OpenCV / skimagedeneyime sahip olarak, Julia ML kütüphanelerini (Flux / JuliaImages) gerçekten CV (herhangi bir) görevi ne kadar hızlı veya yavaş gerçekleştirdiğini görmek ve karşı olup olmadığına karar vermek istiyorum Julia kullanmaya geçmeliyim.

Nasıl timeitböyle modülü kullanarak python bir işlevi yürütmek için zaman almak biliyorum :

#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

Uygun kütüphaneyi kullanarak Julia'da aynı görevi yerine getiren bir fonksiyonun yürütme süresi nasıl karşılaştırılır (bu durumda JuliaImages).

Julia zamana / karşılaştırmaya herhangi bir işlev / makro sağlıyor mu?

Yanıtlar:


10

using BenchmarkToolsJulia işlevlerini karşılaştırmak için önerilen yoldur. Oldukça uzun süren bir şeyi zamanlamadığınız sürece, @benchmarkonlardan verilen veya daha az ayrıntılı @btimemakroları kullanın . Bu makroların arkasındaki makineler hedef işlevi birçok kez değerlendirdiğinden, @timeyavaş çalışan şeyleri karşılaştırmak için yararlıdır (örneğin, disk erişimi veya çok zaman alan hesaplamalar söz konusu olduğunda).

Kullanılması @btimeveya @benchmarkdoğru kullanılması önemlidir , bu yanıltıcı sonuçları önler. Genellikle, bir veya daha fazla argüman alan bir işlevi karşılaştırırsınız. Kıyaslama yapılırken, tüm argümanlar harici değişkenler olmalıdır: (kıyaslama makrosu olmadan)

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

Fonksiyon birçok kez değerlendirilecektir. İşlev her değerlendirildiğinde işlev bağımsız değişkenlerinin yeniden değerlendirilmesini engellemek için, bağımsız $değişken olarak kullanılan her değişkenin adına a öneki ekleyerek her bir bağımsız değişkeni işaretlemeliyiz. Kıyaslama makroları bunu, değişkenin kıyaslama sürecinin başlangıcında bir kez değerlendirilmesini (çözülmesini) ve daha sonra sonucun doğrudan şu şekilde yeniden kullanılması gerektiğini belirtmek için kullanır:

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

Ayarlanabilecek parametreler olsa da, varsayılan değerler genellikle iyi çalışır. Deneyimli ursers için BenchmarkTools hakkında ek bilgi için, bkz manuel .


7

Julia, zamanlama / kıyaslama kodu çalışma zamanı için iki makro sağlar . Bunlar :

  • @time
  • @benchmark : harici, kurulumPkg.add("BenchmarkTools")

BenchmarkTools '@benchmark'ı kullanmak çok kolaydır ve iki dilin hızını karşılaştırmanızda size yardımcı olacaktır. @bencharkVerdiğiniz python tezgahına karşı kullanım örneği .

using Images, FileIO, BenchmarkTools

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

Çıktı :

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

Şimdi ortalama süreyi karşılaştırmak için, samples(46) 'yı python timeit kodunuzdaki sayı olarak koymalı ve ortalama yürütme süresini elde etmek için aynı sayıya bölmelisiniz.

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

Julia ve Python'daki herhangi bir işlevi karşılaştırmak için bu işlemi takip edebilirsiniz. Umarım şüpheniz giderilmiştir.


Not : İstatistiksel açıdan bakıldığında, @benchmark @time değerinden çok daha iyidir.


2
Zamanlama gürültüsünün çoğunlukla pozitif olduğunu ve minimum sürenin genellikle (her zaman değil) daha bilgilendirici olduğunu ima ettiğini unutmayın. @btimeve @belapsedyalnızca minimum süreyi döndürün.
Fredrik Bagge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.