{SLmetrics}: evaluarea performanței AI/ML scalabilă și eficientă în memorie în R

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.