Bằng cách nào tôi có thể điểm chuẩn một chức năng Julia?


11

Lý lịch

Tôi đã tự học máy học và gần đây đã bắt đầu đào sâu vào Hệ sinh thái học máy Julia.


Xuất thân từ nền tảng trăn và có một số kinh nghiệm về Tensorflow và OpenCV / skimage, tôi muốn điểm chuẩn các thư viện Julia ML (Flux / JuliaImages) so với các đối tác của nó để xem nó thực hiện nhanh hay chậm nhiệm vụ CV (bất kỳ) nào và quyết định xem Tôi nên chuyển sang sử dụng Julia.

Tôi biết làm thế nào để có được thời gian thực hiện một chức năng trong python bằng cách sử dụng timeitmô-đun như thế này:

#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

Làm thế nào để so sánh thời gian thực hiện của một chức năng thực hiện cùng một nhiệm vụ trong Julia bằng cách sử dụng thư viện thích hợp (trong trường hợp này JuliaImages).

Julia có cung cấp bất kỳ chức năng / vĩ mô nào cho thời gian / điểm chuẩn không?

Câu trả lời:


10

using BenchmarkToolslà cách được khuyến nghị để điểm chuẩn các chức năng của Julia. Trừ khi bạn định thời gian một cái gì đó mất khá nhiều thời gian, hãy sử dụng @benchmarkhoặc các @btimemacro ít dài hơn được xuất từ ​​nó. Bởi vì máy móc đằng sau các macro này đánh giá chức năng đích nhiều lần, @timerất hữu ích cho việc đo điểm chuẩn những thứ chạy chậm (ví dụ: khi truy cập đĩa hoặc tính toán rất tốn thời gian).

Điều quan trọng là sử dụng @btimehoặc @benchmarkchính xác, điều này tránh kết quả sai lệch. Thông thường, bạn đang điểm chuẩn một hàm có một hoặc nhiều đối số. Khi đo điểm chuẩn, tất cả các đối số phải là biến ngoài: (không có macro điểm chuẩn)

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

Các chức năng sẽ được đánh giá nhiều lần. Để ngăn các đối số hàm được đánh giá lại bất cứ khi nào hàm được đánh giá, chúng ta phải đánh dấu từng đối số bằng cách thêm tiền tố a $vào tên của từng biến được sử dụng làm đối số. Các macro điểm chuẩn sử dụng điều này để chỉ ra rằng biến cần được đánh giá (giải quyết) một lần, khi bắt đầu quá trình đo điểm chuẩn và sau đó kết quả sẽ được sử dụng lại trực tiếp như sau:

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

Mặc dù có các tham số có thể được điều chỉnh, các giá trị mặc định thường hoạt động tốt. Để biết thêm thông tin về BenchmarkTools cho những người có kinh nghiệm, hãy xem hướng dẫn .


7

Julia cung cấp hai macro cho thời gian chạy mã thời gian / điểm chuẩn. Đó là :

  • @thời gian
  • @benchmark : bên ngoài, cài đặt bởiPkg.add("BenchmarkTools")

Sử dụng @benchmark của BenchmarkTools rất dễ dàng và sẽ hữu ích cho bạn trong việc so sánh tốc độ của hai ngôn ngữ. Ví dụ về việc sử dụng @bencharkchống lại băng ghế trăn bạn cung cấp.

using Images, FileIO, BenchmarkTools

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

Đầu ra:

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

Bây giờ để so sánh với thời gian trung bình, bạn nên đặt samples(46) làm số trong mã thời gian python của bạn và chia nó cho cùng một số để có thời gian thực hiện trung bình.

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

Bạn có thể làm theo quy trình này để điểm chuẩn bất kỳ chức năng nào trong cả Julia và Python. Tôi hy vọng bạn nghi ngờ đã được xóa.


Lưu ý : Từ quan điểm thống kê, @benchmark tốt hơn nhiều so với @time.


2
Lưu ý rằng tiếng ồn thời gian chủ yếu là tích cực, ngụ ý rằng thời gian tối thiểu thường (không phải luôn luôn) nhiều thông tin hơn. @btime@belapsedchỉ trả lại thời gian tối thiểu.
Fredrik Bagge
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.