Torch 0.10.0

Nos complace anunciar que la versión 0.10.0 de Torch ya está disponible en CRAN. En este blog resaltamos algunos de los cambios introducidos en esta versión. Para ver todos los detalles, puede revisar el registro completo de cambios aquí.

Precisión Mixta Automática

La técnica de Precisión Mixta Automática (AMP) permite acelerar el entrenamiento de modelos de aprendizaje profundo sin sacrificar la precisión del modelo, combinando el uso de formatos de punto flotante de simple precisión (FP32) y de precisión media (FP16).

Para activar AMP en Torch, deberá utilizar el contexto with_autocast que permite a Torch usar diferentes implementaciones de operaciones capaces de ejecutarse en precisión media. También es bueno escalar la función de coste para conservar gradientes pequeños al acercarse a cero en el espectro de precisión.

He aquí un ejemplo simplificado que no incluye la carga de datos. Encuentre más detalles en la guía de AMP.

...
loss_fn <- nn_mse_loss()$cuda()
net <- make_model(in_size, out_size, num_layers)
opt <- optim_sgd(net$parameters, lr=0.1)
scaler <- cuda_amp_grad_scaler()

for (epoch in seq_len(epochs)) {
  for (i in seq_along(data)) {
    with_autocast(device_type = "cuda", {
      output <- net(data((i)))
      loss <- loss_fn(output, targets((i)))  
    })
    
    scaler$scale(loss)$backward()
    scaler$step(opt)
    scaler$update()
    opt$zero_grad()
  }
}

Con esta estrategia de precisión mixta, se observó un incremento de velocidad de alrededor del 40%. Esta mejora es aún mayor al realizar solo inferencias, es decir, sin necesidad de ajustar el modelo.

Binarios Precompilados

Con binarios precompilados, instalar Torch se vuelve mucho más fácil y rápido, especialmente en Linux con soporte para CUDA. Los binarios incluyen LibLantern y LibTorch, que son necesarios para ejecutar Torch. Si opta por instalar versiones con soporte para CUDA, las bibliotecas CUDA y cuDNN ya vienen incluidas.

Para instalarlos, puede utilizar:

options(timeout = 600) # Es recomendable aumentar el tiempo de espera ya que se descargará un archivo de 2GB.
kind <- "cu117" # Las opciones disponibles actualmente son "cpu" y "cu117".
version <- "0.10.0"
options(repos = c(
  torch = sprintf("https://storage.googleapis.com/torch-lantern-builds/packages/%s/%s/", kind, version),
  CRAN = "https://cloud.r-project.org" # o cualquier otro desde el cual desee instalar las demás dependencias de R.
))
install.packages("torch")

Por ejemplo, ¡es posible iniciar una GPU en Google Colab en menos de 3 minutos!

Ejecutando Torch en Colab

Optimizaciones en Velocidad

Gracias a un issue reportado por @egillax, identificamos y corregimos un problema que provocaba lentitud en funciones de Torch que devolvían una lista de tensores. El caso particular fue torch_split().

El problema se resolvió en la versión 0.10.0 y ahora estos métodos deberían ejecutarse mucho más rápido. A continuación, mostramos una comparación del rendimiento entre la versión 0.9.1 y la versión 0.10.0:

bench::mark(
  torch::torch_split(1:100000, split_size = 10)
)

Con la versión 0.9.1 se obtenía:

# A tibble: 1 × 13
  expression      min  median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time
  <bch:expr> <bch:tm> <bch:t>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>
1 x             322ms   350ms      2.85     397MB     24.3     2    17      701ms
# ℹ 4 more variables: result <list>, memory <list>, time <list>, gc <list>

Mientras que con la versión 0.10.0:

# A tibble: 1 × 13
  expression      min  median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time
  <bch:expr> <bch:tm> <bch:t>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>
1 x              12ms  12.8ms      65.7     120MB     8.96    22     3      335ms
# ℹ 4 more variables: result <list>, memory <list>, time <list>, gc <list>

Refactorización del Sistema de Construcción

El paquete R de Torch depende de LibLantern, una interfaz de C++ para LibTorch. LibLantern forma parte del repositorio de Torch, pero hasta la versión 0.9.1 era necesario compilarlo en un proceso separado antes de compilar el paquete R.

Esto presentaba varias desventajas, como:

  • La instalación desde GitHub no era fiable/reproducible, ya que dependía de un binario precompilado transitorio.
  • Herramientas de devtools como devtools::load_all() no funcionaban si no se compilaba Lantern previamente, dificultando las contribuciones a Torch.

Desde ahora, la compilación de LibLantern se integra en el proceso de construcción del paquete R y se activa con la variable de entorno BUILD_LANTERN=1. No se activa por defecto porque compilar LibLantern requiere cmake y otras herramientas (especialmente con soporte de GPU), donde suele ser preferible utilizar binarios precompilados. Con esta variable configurada, los usuarios pueden usar devtools::load_all() para construir y probar Torch localmente.

Esta opción también es aplicable al instalar versiones de desarrollo de Torch desde GitHub. Si 1 está configurado, Lantern se construirá desde el código fuente en lugar de usar binarios precompilados, lo que mejora la reproducibilidad con versiones de desarrollo.

Además, hemos mejorado el proceso de instalación automática de Torch, con mensajes de error más claros para ayudar a resolver problemas de instalación. Ahora es más fácil personalizar el proceso mediante variables de entorno; para más detalles vea help(install_torch).

Agradecemos a todos los contribuyentes del ecosistema Torch. Este trabajo no sería posible sin su ayuda abriendo issues, creando pull requests y su dedicación.

Si es nuevo utilizando Torch y desea aprender más, le recomendamos el libro recién anunciado 'Deep Learning y Scientific Computing con R torch'.

Si está interesado en contribuir con Torch, no dude en contactarnos por GitHub y revisar nuestra guía para contribuyentes.

El registro completo de cambios para esta versión está disponible aquí.

¿Nos apoyarás hoy?

Creemos que todos merecen entender el mundo en el que viven. Este conocimiento ayuda a crear mejores ciudadanos, vecinos, amigos y custodios de nuestro planeta. Producir periodismo explicativo y profundamente investigado requiere recursos. Puedes apoyar esta misión haciendo una donación económica a Gelipsis hoy. ¿Te sumarás a nosotros?

Suscríbete para recibir nuestro boletín:

Recent Articles

Related Stories

DEJA UN COMENTARIO

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí