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
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 quetorch_float64()
).torch_randn(3, dtype = "float64")
torch_tensor -1.0919 1.3140 1.3559 [ CPUDoubleType{3} ]
-
Vous pouvez maintenant utiliser
with_device()
etlocal_device()
pour modifier temporairement l’appareil sur lequel les tenseurs sont créés. Avant, il fallait utiliserdevice
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} }