Tái lập trong xử lý song song

Lập trình song song trong R

Nabeel Imam

Data Scientist

Tính tái lập là gì?

Cùng đầu vào cho cùng kết quả mỗi lần chạy
  • Có thể kiểm thử mã
  • Người khác có thể lặp lại kết quả

Các dòng mã tạo biểu đồ tròn. Chạy lại cùng dòng mã tạo đúng biểu đồ tròn đó.

Lập trình song song trong R

Bốc thăm may mắn khách hàng

print(customer_ids)
$USA
   [1] 465500 612953 106420 279492 376941 163474 164493 801983 898941 406844 829157 ...
$Canada
   [1] 140521 398164 817703 715385 771801 656814 721270 719120 425819 774558 111418 ...
$Mexico
   [1] 714842 486725 706765 858020 790364 390760 198667 419197 352989 202494 756636 ...
$UK
   [1] 886285 151731 274940 779966 375535 431644 880434 649074 765423 449147 408041 ...
Lập trình song song trong R

Bốc thăm may mắn khách hàng

lucky_draw <- function (ids) {
  sample(ids, 1)
}


cl <- makeCluster(4)
set.seed(1234)
parLapply(cl, customer_ids, lucky_draw) stopCluster(cl)
$USA
[1] 673576

$Canada
[1] 164613

$Mexico
[1] 769658

$UK
[1] 683102
Lập trình song song trong R

Vấn đề tái lập

Người trúng ở lần chạy 1

$USA
[1] 673576

$Canada
[1] 164613

$Mexico
[1] 769658

$UK
[1] 683102

Người trúng ở lần chạy 2

$USA
[1] 638051

$Canada
[1] 133431

$Mexico
[1] 522137

$UK
[1] 856141
Lập trình song song trong R

Lời giải

cl <- makeCluster(4)

# Một seed cho tất cả tiến trình worker trong cụm clusterSetRNGStream(cl, 1234)
parLapply(cl, customer_ids, lucky_draw) stopCluster(cl)
Lập trình song song trong R

Nhiều lần chạy, cùng kết quả

Người trúng ở lần chạy 1

$USA
[1] 421408

$Canada
[1] 877562

$Mexico
[1] 460786

$UK
[1] 658513

Người trúng ở lần chạy 2

$USA
[1] 421408

$Canada
[1] 877562

$Mexico
[1] 460786

$UK
[1] 658513
Lập trình song song trong R

Nhiều lần chạy, cùng kết quả

Lần chạy 1

cl <- makeCluster(4)

clusterSetRNGStream(cl, 1234)


run1 <- parLapply(cl, customer_ids, lucky_draw) stopCluster(cl)

Lần chạy 2

cl <- makeCluster(4)

clusterSetRNGStream(cl, 1234)

run2 <- parLapply(cl, customer_ids, lucky_draw)
stopCluster(cl)


identical(run1, run2)
[1] TRUE
Lập trình song song trong R

Kết quả tái lập với furrr

Lần chạy 1
config <- furrr_options(seed = 1234)


plan(multisession, workers = 4) run1 <- future_map(customer_ids, lucky_draw, .options = config) plan(sequential)
Lần chạy 2
plan(multisession, workers = 4)

run2 <- future_map(customer_ids, lucky_draw,
                  # Dùng cùng cấu hình
                  .options = config)
plan(sequential)

identical(run1, run2)
[1] TRUE
Lập trình song song trong R

Kết quả tái lập với foreach

Lần chạy 1
install.packages("doRNG")
library(doRNG)


cl <- makeCluster(4) registerDoParallel(cl)
registerDoRNG(1234)
run1 <- foreach(i = customer_ids) %dopar% { lucky_draw(i) } stopCluster(cl)
Lần chạy 2
cl <- makeCluster(4)
registerDoParallel(cl)
registerDoRNG(1234) # Cùng seed

run2 <- foreach(i = customer_ids) %dopar% {
  lucky_draw(i)
}
stopCluster(cl)

identical(run1, run2)
[1] TRUE
Lập trình song song trong R

Khi nào cần nghĩ về tái lập

  • Gọi trực tiếp bộ sinh số ngẫu nhiên
    • rnorm, rbinom, v.v.
  • Lấy mẫu ngẫu nhiên
    • Bootstrap
    • sample_n() từ dplyr
Lập trình song song trong R

Ayo berlatih!

Lập trình song song trong R

Preparing Video For Download...