[julia] Julia 기능을 어떤 방식으로 벤치마킹 할 수 있습니까?

배경

나는 스스로 기계 학습을 배웠고 최근에 Julia Machine Learning Ecosystem을 탐구하기 시작했습니다.


파이썬 배경에서오고 Tensorflow와 OpenCV / skimage경험을 가지고 있기 때문에 Julia ML 라이브러리 (Flux / JuliaImages) 를 상대 라이브러리 와 비교하여 실제로 CV (임의의) 작업을 얼마나 빨리 또는 느리게 수행하는지 확인 하고 싶습니다. Julia를 사용하도록 전환해야합니다.

다음 timeit과 같은 모듈을 사용하여 파이썬에서 함수를 실행하는 데 걸리는 시간을 얻는 방법을 알고 있습니다 .

#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에서 동일한 작업을 수행하는 함수의 실행 시간을 어떻게 비교합니까 ?

Julia는 시간 / 벤치 마크에 기능 / 매크로를 제공합니까?



답변

using BenchmarkToolsJulia 함수를 벤치마킹하는 데 권장되는 방법입니다. 꽤 오랜 시간이 걸리는 경우를 제외하고는 그 중에서 내 보낸 @benchmark덜 자세한 @btime매크로를 사용하십시오. 이 매크로 뒤의 기계는 대상 기능을 여러 번 평가하기 때문에 @time느리게 실행되는 항목을 벤치마킹하는 데 유용합니다 (예 : 디스크 액세스 또는 시간이 많이 걸리는 계산이 관련된 경우).

사용하는 것이 중요하다 @btime또는 @benchmark제대로,이 피합니다 결과를 오해의 소지가. 일반적으로 하나 이상의 인수를 취하는 함수를 벤치마킹하고 있습니다. 벤치마킹 할 때 모든 인수는 외부 변수 여야합니다 (벤치 마크 매크로 제외).

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

기능은 여러 번 평가됩니다. 함수가 평가 될 때마다 함수 인수가 다시 평가되지 않도록하려면 인수로 사용되는 $각 변수의 이름 앞에 a 를 붙여 각 인수를 표시해야합니다 . 벤치마킹 매크로는이를 사용하여 벤치마킹 프로세스가 시작될 때 변수가 한 번 평가 (해결)되고 결과는 그대로 그대로 재사용됨을 나타냅니다.

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

조정할 수있는 것보다 매개 변수가 있지만 일반적으로 기본값이 잘 작동합니다. 숙련 된 urser 용 BenchmarkTools에 대한 자세한 내용 은 설명서를 참조하십시오 .


답변

Julia는 타이밍 / 벤치마킹 코드 런타임을위한 두 가지 매크로 를 제공 합니다. 이것들은 :

  • @시각
  • @benchmark : 외부, 설치Pkg.add("BenchmarkTools")

BenchmarkTools의 @benchmark를 사용하는 것은 매우 쉽고 두 언어의 속도를 비교하는 데 도움이됩니다. @benchark제공 한 파이썬 벤치에 대한 사용 예 .

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파이썬 timeit 코드 에 (46)을 숫자로 넣고 동일한 숫자로 나누어 평균 실행 시간을 얻습니다.

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

Julia와 Python의 모든 함수를 벤치마킹하기 위해이 프로세스를 따를 수 있습니다. 의심의 여지가 없길 바랍니다.


참고 : 통계적 관점에서 @benchmark는 @time보다 훨씬 낫습니다.


답변