0Pricing
R Academy · Ders

parallel Paketi ve detectCores()

Çatallanmış veya soket kümeleri başlatın ve işleri CPU çekirdeklerine dağıtın.

parallel Paketi ve detectCores(), CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

Paralel Hesaplama Neden Kullanılır?

Modern bilgisayarlarda birden çok CPU çekirdeği bulunur. R varsayılan olarak tek çekirdekte çalışır ve diğerlerini boşta bırakır. R'ye yerleşik parallel paketi, yinelemeli hesaplamaları hızlandırmak için tüm çekirdeklerden yararlanmanızı sağlar.

# Check how many cores your machine has
library(parallel)

total_cores <- detectCores()
logical_cores <- detectCores(logical = TRUE)
physical_cores <- detectCores(logical = FALSE)

cat('Total logical cores:', total_cores, '
')
cat('Physical cores:', physical_cores, '
')

makeCluster ve stopCluster

makeCluster(n), n çalışan işlemi başlatır. Kaynakları serbest bırakmak için işiniz bittiğinde her zaman stopCluster(cl) çağrısı yapın. Yaygın bir yaklaşım, bir çekirdeği OS için boş bırakmak amacıyla detectCores() - 1 kullanmaktır.

library(parallel)

# Spawn workers (leave 1 core for system)
n_cores <- detectCores() - 1
cl <- makeCluster(n_cores)

cat('Cluster created with', n_cores, 'workers\n')

# Always clean up!
stopCluster(cl)
cat('Cluster stopped.\n')

clusterExport: Değişkenleri Paylaşma

Çalışan işlemlerinin kendi bellek alanları vardır ve genel ortamınızı göremezler. Adlandırılmış nesneleri ana işlemden tüm çalışanlara kopyalamak için clusterExport(cl, varlist) kullanın.

library(parallel)
cl <- makeCluster(2)

# Define a variable and a function in the master
base_value <- 100
add_base <- function(x) x + base_value

# Export them to workers
clusterExport(cl, varlist = c('base_value', 'add_base'))

# Now workers can use them
result <- parLapply(cl, 1:4, function(x) add_base(x))
cat(unlist(result), '\n')  # 101 102 103 104

stopCluster(cl)

clusterEvalQ: Kurulum Kodunu Çalıştırma

clusterEvalQ(cl, expr), bir ifadeyi her çalışan üzerinde değerlendirir; ana hesaplama başlamadan önce tüm düğümlerde paketleri yüklemek veya yardımcı dosyaları kaynak olarak eklemek için kullanışlıdır.

library(parallel)
cl <- makeCluster(2)

# Load a package on every worker
clusterEvalQ(cl, {
  library(stats)
  set.seed(42)  # set seed per worker
})

# Each worker can now use stats functions
result <- parLapply(cl, 1:4, function(n) rnorm(n, mean = 0, sd = 1))
result[[1]]  # one random normal value

stopCluster(cl)

parLapply: Paralel lapply

parLapply(cl, X, FUN), lapply() işlevinin paralel karşılığıdır. X öğelerini çalışanlara dağıtır ve sonuçları bir liste olarak toplar. Tüm platformlarda (Windows, macOS, Linux) çalışır.

library(parallel)
cl <- makeCluster(2)

# Simulate slow computation: sleep 0.1s per item
clusterEvalQ(cl, Sys.sleep)

slow_square <- function(x) {
  Sys.sleep(0.05)
  x^2
}

clusterExport(cl, 'slow_square')

system.time(
  result <- parLapply(cl, 1:8, slow_square)
)
cat(unlist(result), '\n')  # 1 4 9 16 25 36 49 64

stopCluster(cl)

parSapply: Basitleştirilmiş Sonuçlar

parSapply(cl, X, FUN), sapply() işlevinin paralel sürümüdür. Mümkün olduğunda sonucu otomatik olarak vektöre veya matrise dönüştürür; bu nedenle işleviniz skaler döndürdüğünde kullanışlıdır.

library(parallel)
cl <- makeCluster(2)

# parSapply returns a simplified vector
squares <- parSapply(cl, 1:10, function(x) x^2)
cat(squares, '\n')  # 1 4 9 16 25 36 49 64 81 100

# Returns a matrix if FUN returns a vector of same length
stats_result <- parSapply(cl, 1:4, function(n) {
  x <- rnorm(100)
  c(mean = mean(x), sd = sd(x))
})
print(stats_result)  # 2x4 matrix

stopCluster(cl)

mclapply: Çatallama Tabanlı Paralellik

mclapply(), yeni işlemler başlatmak yerine mevcut R işlemini kopyalayan çatallama yöntemini kullanır; bu, başlatmayı hızlandırır ve çalışanların üst ortamına örtük olarak erişmesini sağlar. Ancak yalnızca Unix/macOS üzerinde çalışır, Windows'ta çalışmaz.

library(parallel)

# mclapply: Unix/macOS only
# Workers inherit the parent environment automatically
base_value <- 42

if (.Platform$OS.type != 'windows') {
  result <- mclapply(
    1:8,
    function(x) x * base_value,  # base_value visible without export
    mc.cores = 4
  )
  cat(unlist(result), '\n')
} else {
  cat('mclapply not supported on Windows. Use parLapply instead.\n')
}

Sıralı ve Paralel Çalışmayı Karşılaştırma

Paralelliğin ek yükleri vardır: küme başlatma, veri serileştirme ve işlemler arası iletişim zaman alır. Paralellik, yalnızca öğe başına hesaplama bu ek yükü aşacak kadar maliyetliyse yarar sağlar.

library(parallel)
cl <- makeCluster(2)

# Task: compute 100 iterations of matrix multiply
heavy_task <- function(n) {
  m <- matrix(rnorm(200), nrow = 100)
  sum(m %*% t(m))
}
clusterExport(cl, 'heavy_task')

seq_time <- system.time(lapply(1:20, heavy_task))[['elapsed']]
par_time <- system.time(parLapply(cl, 1:20, heavy_task))[['elapsed']]

cat('Sequential:', round(seq_time, 3), 's\n')
cat('Parallel:  ', round(par_time, 3), 's\n')
cat('Speedup:   ', round(seq_time / par_time, 2), 'x\n')

stopCluster(cl)

Paralel Çalışmada RNG için Tohum Belirleme

Paralel çalışmada rastgele sayı üretimi zordur; her çalışanın bağımsız ve tekrarlanabilir bir akışa ihtiyacı vardır. Tekrarlanabilir paralel rastgelelik elde etmek için L'Ecuyer-CMRG üreteciyle clusterSetRNGStream(cl, seed) kullanın.

library(parallel)
cl <- makeCluster(2)

# Set reproducible RNG streams across workers
clusterSetRNGStream(cl, iseed = 123)

# Each worker uses its own independent random stream
results1 <- parSapply(cl, 1:6, function(i) rnorm(1))

# Reset and repeat — same results
clusterSetRNGStream(cl, iseed = 123)
results2 <- parSapply(cl, 1:6, function(i) rnorm(1))

cat('Run 1:', round(results1, 4), '\n')
cat('Run 2:', round(results2, 4), '\n')
cat('Identical:', identical(results1, results2), '\n')

stopCluster(cl)

Kümelerde Hata İşleme

Bir çalışan hata oluşturursa parLapply() bu hatayı ana işlemde yeniden oluşturur. Çağrıları işlevin içinde tryCatch() ile veya başarısızlıkları düzgün biçimde ele almak için tüm parLapply() çağrısının çevresinde tryCatch() ile sarın.

library(parallel)
cl <- makeCluster(2)

# Wrap risky code inside the worker function
safe_log <- function(x) {
  tryCatch(
    log(x),
    warning = function(w) NA_real_,
    error   = function(e) NA_real_
  )
}
clusterExport(cl, 'safe_log')

# -1 produces NaN warning, 'a' produces an error
input <- list(4, 9, -1, 'a', 16)
result <- parLapply(cl, input, safe_log)
cat(unlist(result), '\n')  # 1.386 2.197 NaN NA 2.773

stopCluster(cl)

Pratik Paralel Çalışma Düzeni

Eksiksiz ve yerleşik yaklaşıma uygun bir paralel iş akışı şöyledir: çekirdekleri algılayın, küme oluşturun, bağımlılıkları dışa aktarın, hesaplamayı çalıştırın, sonuçları toplayın ve hata oluşsa bile on.exit() kullanarak kümeyi her zaman durdurun.

library(parallel)

run_parallel <- function(data, fn, n_workers = detectCores() - 1) {
  cl <- makeCluster(n_workers)
  on.exit(stopCluster(cl))  # guaranteed cleanup

  clusterExport(cl, 'fn', envir = environment())

  result <- parLapply(cl, data, fn)
  result
}

# Example: bootstrap mean estimation
samples <- lapply(1:100, function(i) rnorm(50, mean = 5, sd = 2))
means <- run_parallel(samples, mean)

cat('Grand mean:', round(mean(unlist(means)), 3), '\n')
cat('95% CI: [',
    round(quantile(unlist(means), 0.025), 3), ',',
    round(quantile(unlist(means), 0.975), 3), ']\n')

Hızlı Kontrol

Paralel kodunuzun içinde bir hata oluşsa bile stopCluster(cl) çağrısının yapılmasını garanti etmek için hangi işlevi kullanmalısınız?

Özet: parallel Paketi

Temel çıkarımlar:

  • detectCores() kullanılabilir çekirdekleri bildirir; küme boyutu için detectCores() - 1 kullanın
  • makeCluster(n) / stopCluster(cl) çalışanların yaşam döngülerini yönetir
  • clusterExport() nesneleri kopyalar; clusterEvalQ() çalışanlarda kurulum kodunu çalıştırır
  • parLapply() / parSapply() platformlar arası paralel yineleyicilerdir
  • mclapply() yalnızca Unix'te çalışır, ancak çatallama sayesinde daha hızlı başlar
  • Temizliğin garanti edilmesi için on.exit(stopCluster(cl)) kullanın
  • Paralellik yalnızca hesaplama açısından ağır görevlerde yarar sağlar
# Minimal reproducible parallel pattern
library(parallel)

cl <- makeCluster(max(1, detectCores() - 1))
on.exit(stopCluster(cl))

clusterSetRNGStream(cl, iseed = 42)
result <- parSapply(cl, 1:8, function(x) x^2 + rnorm(1, 0, 0.1))
cat(round(result, 2), '\n')

Sıkça Sorulan Sorular

“parallel Paketi ve detectCores()” dersi ücretsiz mi?

Evet — “parallel Paketi ve detectCores()” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“parallel Paketi ve detectCores()” dersinde ne öğreneceğim?

Çatallanmış veya soket kümeleri başlatın ve işleri CPU çekirdeklerine dağıtın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“parallel Paketi ve detectCores()” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. parallel Paketi ve detectCores()
  2. future Çerçevesi
  3. furrr: Paralel purrr İşlemleri
  4. Paralel Kodda Hata Ayıklama ve Yük Dengeleme
← R Academy Sayfasına Dön