การทำซ้ำได้ในการประมวลผลแบบขนาน

การเขียนโปรแกรมแบบขนานใน R

Nabeel Imam

Data Scientist

การทำซ้ำได้คืออะไร?

อินพุตเดิมให้ผลลัพธ์เดิมทุกครั้งที่รันโค้ด
  • ทดสอบโค้ดได้
  • ผู้อื่นสามารถทำซ้ำผลลัพธ์ได้

โค้ดหลายบรรทัดสร้างแผนภูมิวงกลม และเมื่อรันโค้ดชุดเดิมอีกครั้งก็ได้แผนภูมิวงกลมที่เหมือนกันทุกประการ

การเขียนโปรแกรมแบบขนานใน R

การจับรางวัลลูกค้า

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 ...
การเขียนโปรแกรมแบบขนานใน R

การจับรางวัลลูกค้า

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
การเขียนโปรแกรมแบบขนานใน R

ปัญหาการทำซ้ำได้

ผู้ชนะจากการรันครั้งที่ 1

$USA
[1] 673576

$Canada
[1] 164613

$Mexico
[1] 769658

$UK
[1] 683102

ผู้ชนะจากการรันครั้งที่ 2

$USA
[1] 638051

$Canada
[1] 133431

$Mexico
[1] 522137

$UK
[1] 856141
การเขียนโปรแกรมแบบขนานใน R

วิธีแก้ปัญหา

cl <- makeCluster(4)

# A seed for all worker processes in cluster clusterSetRNGStream(cl, 1234)
parLapply(cl, customer_ids, lucky_draw) stopCluster(cl)
การเขียนโปรแกรมแบบขนานใน R

รันหลายครั้งได้ผลลัพธ์เดิม

ผู้ชนะจากการรันครั้งที่ 1

$USA
[1] 421408

$Canada
[1] 877562

$Mexico
[1] 460786

$UK
[1] 658513

ผู้ชนะจากการรันครั้งที่ 2

$USA
[1] 421408

$Canada
[1] 877562

$Mexico
[1] 460786

$UK
[1] 658513
การเขียนโปรแกรมแบบขนานใน R

รันหลายครั้งได้ผลลัพธ์เดิม

การรันครั้งที่ 1

cl <- makeCluster(4)

clusterSetRNGStream(cl, 1234)


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

การรันครั้งที่ 2

cl <- makeCluster(4)

clusterSetRNGStream(cl, 1234)

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


identical(run1, run2)
[1] TRUE
การเขียนโปรแกรมแบบขนานใน R

ผลลัพธ์ที่ทำซ้ำได้ด้วย furrr

การรันครั้งที่ 1
config <- furrr_options(seed = 1234)


plan(multisession, workers = 4) run1 <- future_map(customer_ids, lucky_draw, .options = config) plan(sequential)
การรันครั้งที่ 2
plan(multisession, workers = 4)

run2 <- future_map(customer_ids, lucky_draw,
                  # Using the same configuration
                  .options = config)
plan(sequential)

identical(run1, run2)
[1] TRUE
การเขียนโปรแกรมแบบขนานใน R

ผลลัพธ์ที่ทำซ้ำได้ด้วย foreach

การรันครั้งที่ 1
install.packages("doRNG")
library(doRNG)


cl <- makeCluster(4) registerDoParallel(cl)
registerDoRNG(1234)
run1 <- foreach(i = customer_ids) %dopar% { lucky_draw(i) } stopCluster(cl)
การรันครั้งที่ 2
cl <- makeCluster(4)
registerDoParallel(cl)
registerDoRNG(1234) # Same seed

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

identical(run1, run2)
[1] TRUE
การเขียนโปรแกรมแบบขนานใน R

เมื่อใดควรคำนึงถึงการทำซ้ำได้

  • เรียกใช้ฟังก์ชันสุ่มตัวเลขโดยตรง
    • rnorm, rbinom ฯลฯ
  • การสุ่มตัวอย่าง
    • Bootstrap
    • sample_n() จาก dplyr
การเขียนโปรแกรมแบบขนานใน R

มาฝึกกันเถอะ!

การเขียนโปรแกรมแบบขนานใน R

Preparing Video For Download...