(Acest articol a fost publicat pentru prima dată pe R-posts.comși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Pe 3 decembrie 2024, a fost publicată o postare despre lansarea {SLmetrics}. Astăzi, 11 ianuarie 2025, versiunea 0.3-1
a fost lansat și vine cu multe funcții noi. Printre acestea se numără valorile ponderate de clasificare și regresie, suportul OpenMP și o gamă largă de noi valori de evaluare.
În această postare pe blog, voi evalua {SLmetrics} și voi demonstra cum se compară cu pachetele similare R {MLmetrics} și {yardstick} în ceea ce privește timpul de execuție și eficiența memoriei – determinanți esențiali pentru scalabilitate și eficiență.
Funcția de referință
Pentru a rula benchmark-ul {SLmetrics}, {MLmetrics} și {yardstick}, voi folosi {bench} care măsoară timpul mediu de execuție și eficiența memoriei. Mai jos am creat o funcție wrapper:
## benchmark function benchmark <- function( ..., m = 10) { library(magrittr) # 1) create list # for storing values performance <- list() for (i in 1:m) { # 1) run the benchmarks results <- bench::mark( ..., iterations = 10, check = FALSE ) # 2) extract values # and calculate medians performance$time((i)) <- setNames( lapply(results$time, mean), results$expression ) performance$memory((i)) <- setNames( lapply(results$memory, function(x) { sum(x$bytes, na.rm = TRUE)} ), results$expression) performance$n_gc((i)) <- setNames( lapply(results$n_gc, sum), results$expression ) } purrr::pmap_dfr( list(performance$time, performance$memory, performance$n_gc), ~{ tibble::tibble( expression = names(..1), time = unlist(..1), memory = unlist(..2), n_gc = unlist(..3) ) } ) %>% dplyr::mutate(expression = factor(expression, levels = unique(expression))) %>% dplyr::group_by(expression) %>% dplyr::filter(dplyr::row_number() > 1) %>% dplyr::summarize( execution_time = bench::as_bench_time(median(time)), memory_usage = bench::as_bench_bytes(median(memory)), gc_calls = median(n_gc), .groups = "drop" ) }
Funcția wrapper rulează 10 x 10
benchmark-uri ale fiecărei funcții trecute – renunță la prima rulare pentru a permite funcțiilor să se încălzească, înainte ca valorile de referință să fie înregistrate.
Toate valorile sunt calculate în medie pe execuții și apoi prezentate ca durata medie de rulare, utilizarea mediană a memoriei și numărul mediu de gc()
-apeluri în timpul benchmark-ului.
Evaluare comparativă {SLmetrics}
Evaluarea comparativă cu și fără OpenMP
În primul set de benchmark-uri, voi demonstra noua caracteristică OpenMP care a fost livrată cu versiunea 0.3-1
. Pentru benchmark, vom compara timpul de execuție și eficiența memoriei calculării unei matrice de confuzie 3×3 pe doi vectori de length
10.000.000 cu și fără OpenMP. Codul sursă și rezultatele sunt prezentate mai jos:
## 1) set seed set.seed(1903) ## 2) define values ## for classes actual <- factor(sample(letters(1:3), 1e7, TRUE)) predicted <- factor(sample(letters(1:3), 1e7, TRUE)) ## 3) benchmark with OpenMP SLmetrics::setUseOpenMP(TRUE) #> OpenMP usage set to: enabled benchmark(`{With OpenMP}` = SLmetrics::cmatrix(actual, predicted)) #> # A tibble: 1 × 4 #> expression execution_time memory_usage gc_calls #>#> 1 {With OpenMP} 1ms 0B 0 ## 4) benchmark without OpenMP SLmetrics::setUseOpenMP(FALSE) #> OpenMP usage set to: disabled benchmark(`{Without OpenMP}` = SLmetrics::cmatrix(actual, predicted)) #> # A tibble: 1 × 4 #> expression execution_time memory_usage gc_calls #> #> 1 {Without OpenMP} 6.27ms 0B 0
Matricea de confuzie este calculată în mai puțin de o milisecundă și în aproximativ șase milisecunde cu și, respectiv, fără OpenMP. În ambele cazuri, folosește memoria zero sau aproape de zero.
Evaluare comparativă cu {MLmetrics} și {yardstick}
În al doilea set de benchmark-uri, voi compara timpul de execuție și eficiența memoriei {SLmetrics} cu {MLmetrics} și {yardstick}. Codul sursă și rezultatele sunt prezentate mai jos:
## 1) define classes set.seed(1903) fct_actual <- factor(sample(letters(1:3), size = 1e7, replace = TRUE)) fct_predicted <- factor(sample(letters(1:3), size = 1e7, replace = TRUE)) ## 2) perform benchmark benchmark( `{SLmetrics}` = SLmetrics::cmatrix(fct_actual, fct_predicted), `{MLmetrics}` = MLmetrics::ConfusionMatrix(fct_predicted, fct_actual), `{yardstick}` = yardstick::conf_mat(table(fct_actual, fct_predicted)) ) #> # A tibble: 3 × 4 #> expression execution_time memory_usage gc_calls #>#> 1 {SLmetrics} 6.34ms 0B 0 #> 2 {MLmetrics} 344.13ms 381MB 19 #> 3 {yardstick} 343.75ms 381MB 19
{SLmetrics} este de aproximativ 60 de ori mai rapid decât ambele și semnificativ mai eficient în memorie, așa cum este demonstrat de memory_usage
şi gc_calls
. În această perspectivă, {SLmetrics} este mai eficient și mai scalabil decât ambele pachete, deoarece utilizarea memoriei este practic liniară. Vezi mai jos:
## 1) define classes set.seed(1903) fct_actual <- factor(sample(letters(1:3), size = 2e7, replace = TRUE)) fct_predicted <- factor(sample(letters(1:3), size = 2e7, replace = TRUE)) ## 2) perform benchmark benchmark( `{SLmetrics}` = SLmetrics::cmatrix(fct_actual, fct_predicted), `{MLmetrics}` = MLmetrics::ConfusionMatrix(fct_predicted, fct_actual), `{yardstick}` = yardstick::conf_mat(table(fct_actual, fct_predicted)) ) #> # A tibble: 3 × 4 #> expression execution_time memory_usage gc_calls #>#> 1 {SLmetrics} 12.3ms 0B 0 #> 2 {MLmetrics} 648.5ms 763MB 19 #> 3 {yardstick} 654.7ms 763MB 19
{SLmetrics} poate procesa de 60 de ori datele în același timp în care este nevoie de {MLmetrics} și {yardstick} pentru a procesa 40.000.000 de puncte de date – fără costuri suplimentare de memorie.
Rezumat
Benchmark-urile sugerează că {SLmetrics} este un candidat puternic la pachetele mai consacrate {MLmetrics} și {yardstick} în ceea ce privește scalabilitatea, eficiența memoriei și viteza.
Se instalează {SLmetrics}
{SLmetrics} este încă în curs de dezvoltare și, prin urmare, nu este pe CRAN. Dar cea mai recentă versiune poate fi instalată folosind {devtools}. O versiune de dezvoltare este, de asemenea, disponibilă pentru cei care trăiesc pe margine. Vezi mai jos:
Versiune stabilă
## install stable release devtools::install_github( repo = 'https://github.com/serkor1/SLmetrics@*release', ref="main" )
Versiune de dezvoltare
## install development version devtools::install_github( repo = 'https://github.com/serkor1/SLmetrics', ref="development" )
Dacă ați ajuns până aici: vă mulțumim pentru că ați citit articolul de blog și nu ezitați să lăsați un comentariu aici sau în depozit.
{SLmetrics}: evaluarea performanței AI/ML scalabilă și eficientă în memorie în R a fost publicată pentru prima dată pe 11 ianuarie 2025 la 18:33.