mardi, novembre 28, 2023

Posit AI Blog : torche 0.11.0



torch v0.11.0 est maintenant sur CRAN ! Cet article de blog met en évidence certaines des modifications incluses dans cette version. Mais vous pouvez toujours trouver l’intégralité journal des modifications
sur le site de la torche.

Chargement amélioré des dictionnaires d’état

Depuis longtemps, il est possible d’utiliser la torche de R pour charger des dicts d’état (c’est-à-dire des poids de modèle) entraînés avec PyTorch à l’aide de l’outil load_state_dict() fonction. Cependant, il était courant d’obtenir l’erreur :

Error in cpp_load_state_dict(path) :  isGenericDict() INTERNAL ASSERT FAILED at

Cela s’est produit parce que lors de la sauvegarde du state_dict de Python, ce n’était pas vraiment un dictionnaire, mais un commandé dictionnaire. Les poids dans PyTorch sont sérialisés comme Cornichon fichiers – un format spécifique à Python similaire à notre RDS. Pour les charger en C++, sans runtime Python, LibTorch implémente un lecteur pickle capable de lire uniquement un sous-ensemble du format de fichier, et ce sous-ensemble n’incluait pas les dicts ordonnés.

Cette version ajoute la prise en charge de la lecture des dictionnaires commandés, vous ne verrez donc plus cette erreur.

En plus de cela, la lecture de ces fichiers nécessite la moitié de l’utilisation maximale de la mémoire et, par conséquent, est également beaucoup plus rapide. Voici les horaires de lecture d’un modèle de paramètres 3B (StableLM-3B) avec la v0.10.0 :

system.time({
  x <- torch::load_state_dict("~/Downloads/pytorch_model-00001-of-00002.bin")
  y <- torch::load_state_dict("~/Downloads/pytorch_model-00002-of-00002.bin")
})
   user  system elapsed 
662.300  26.859 713.484 

et avec la v0.11.0

   user  system elapsed 
  0.022   3.016   4.016 

Cela signifie que nous sommes passés de quelques minutes à quelques secondes seulement.

Utiliser les opérations JIT

L’un des moyens les plus courants d’étendre LibTorch/PyTorch consiste à implémenter des opérations JIT. Cela permet aux développeurs d’écrire du code personnalisé et optimisé en C++ et de l’utiliser directement dans PyTorch, avec une prise en charge complète du traçage et des scripts JIT. Voir notre « Torcher hors des sentiers battus »
article de blog si vous souhaitez en savoir plus.

L’utilisation d’opérateurs JIT dans R exigeait auparavant que les développeurs de packages implémentent C++/Rcpp pour chaque opérateur s’ils voulaient pouvoir les appeler directement depuis R. Cette version a ajouté la prise en charge de l’appel des opérateurs JIT sans obliger les auteurs à implémenter les wrappers.

Le seul changement visible est que nous avons maintenant un nouveau symbole dans l’espace de noms de la torche, appelé
jit_ops. Chargons torchvisionlib, une extension torch qui enregistre de nombreuses opérations JIT différentes. Il suffit de charger le paquet avec library(torchvisionlib) rendra ses opérateurs disponibles pour que Torch puisse les utiliser – en effet, le mécanisme qui enregistre les opérateurs agit lorsque la DLL du package (ou la bibliothèque partagée) est chargée.

Par exemple, utilisons le read_file opérateur qui lit efficacement un fichier dans un tenseur de torche brut (octets).

library(torchvisionlib)
torch::jit_ops$image$read_file("img.png")
torch_tensor
 137
  80
  78
  71
 ...
   0
   0
 103
... [the output was truncated (use n=-1 to disable)]
[ CPUByteType{325862} ]

Nous avons fait en sorte que la saisie semi-automatique fonctionne correctement, de sorte que vous puissiez explorer de manière interactive les opérateurs disponibles à l’aide de jit_ops$ et en appuyant pour déclencher la saisie semi-automatique de RStudio.

Autres petites améliorations

Cette version ajoute également de nombreuses petites améliorations qui rendent Torch plus intuitive :

  • Vous pouvez maintenant spécifier le type du tenseur à l’aide d’une chaîne, par exemple : torch_randn(3, dtype = "float64"). (Auparavant, vous deviez spécifier le type à l’aide d’une fonction torch, telle que torch_float64()).

    torch_randn(3, dtype = "float64")
    torch_tensor
    -1.0919
     1.3140
     1.3559
    [ CPUDoubleType{3} ]
  • Vous pouvez maintenant utiliser with_device() et local_device() pour modifier temporairement l’appareil sur lequel les tenseurs sont créés. Avant, il fallait utiliser device dans chaque appel de fonction de création de tenseur. Cela permet d’initialiser un module sur un appareil spécifique :

    with_device(device="mps", {
      linear <- nn_linear(10, 1)
    })
    linear$weight$device
    torch_device(type='mps', index=0)
  • Il est désormais possible de modifier temporairement le seed de la torche, ce qui facilite la création de programmes reproductibles.

    with_torch_manual_seed(seed = 1, {
      torch_randn(1)
    })
    torch_tensor
     0.6614
    [ CPUFloatType{1} ]

Merci à tous les contributeurs à l’écosystème de la torche. Ce travail ne serait pas possible sans tous les numéros utiles ouverts, les relations publiques que vous avez créées et votre travail acharné.

Si vous débutez avec Torch et que vous souhaitez en savoir plus, nous vous recommandons vivement le récemment annoncé livre ‘Deep Learning et calcul scientifique avec R torch‘.

Si vous souhaitez commencer à contribuer à Torch, n’hésitez pas à nous contacter sur GitHub et à consulter notre guide de contribution.

Le journal des modifications complet pour cette version peut être trouvé ici.

photo par Ian Schneider sur Unsplash

Réutilisation

Le texte et les figures sont sous licence Creative Commons Attribution CC PAR 4.0. Les figures réutilisées à partir d’autres sources ne relèvent pas de cette licence et sont reconnaissables à une note dans leur légende : « Figure de… ».

Citation

Pour l’attribution, veuillez citer ce travail comme

Falbel (2023, June 7). Posit AI Blog: torch 0.11.0. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2023-06-07-torch-0-11/

Citation BibTeX

@misc{torch-0-11-0,
  author = {Falbel, Daniel},
  title = {Posit AI Blog: torch 0.11.0},
  url = {https://blogs.rstudio.com/tensorflow/posts/2023-06-07-torch-0-11/},
  year = {2023}
}

Related Articles

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Latest Articles