Nous sommes heureux de vous annoncer que torch
La v0.9.0 est maintenant sur CRAN. Cette version ajoute la prise en charge des systèmes ARM exécutant macOS et apporte des améliorations significatives des performances. Cette version inclut également de nombreuses corrections de bogues et fonctionnalités plus petites. Le journal des modifications complet peut être trouvé ici.
Amélioration des performances
torch
pour R utilise LibTorch comme backend. Il s’agit de la même bibliothèque qui alimente PyTorch, ce qui signifie que nous devrions constater des performances très similaires lors de la comparaison des programmes.
Cependant, torch
a une conception très différente de celle d’autres bibliothèques d’apprentissage automatique enveloppant des bases de code C++ (par exemple, xgboost
). Là, la surcharge est insignifiante car il n’y a que quelques appels de fonction R avant de commencer à entraîner le modèle ; toute la formation se déroule alors sans jamais quitter le C++. Dans torch
, les fonctions C++ sont encapsulées au niveau des opérations. Et comme un modèle se compose de plusieurs appels aux opérateurs, cela peut rendre la surcharge des appels de fonction R plus importante.
Nous avons établi un ensemble de critères de référence, chacun essayant d’identifier les goulots d’étranglement des performances dans des domaines spécifiques. torch
caractéristiques. Dans certains tests, nous avons pu rendre la nouvelle version jusqu’à 250 fois plus rapide que la dernière version du CRAN. En chiffres 1 nous pouvons voir la performance relative de torch
v0.9.0 et torch
v0.8.1 dans chacun des tests exécutés sur l’appareil CUDA :

Figure 1 : Performances relatives de la v0.8.1 par rapport à la v0.9.0 sur le périphérique CUDA. Les performances relatives sont mesurées par (new_time/old_time)^-1.
La principale source d’amélioration des performances sur le GPU réside dans une meilleure gestion de la mémoire, en évitant les appels inutiles au garbage collector R. Voir plus de détails dans le Article « Gestion de la mémoire » dans le torch
Documentation.
Sur le périphérique CPU, nous avons des résultats moins expressifs, même si certains benchmarks sont 25 fois plus rapides avec la v0.9.0. Sur le processeur, le principal goulot d’étranglement en termes de performances qui a été résolu est l’utilisation d’un nouveau thread pour chaque appel en arrière. Nous utilisons maintenant un pool de threads, ce qui rend le en arrière et optimal des tests de performances presque 25 fois plus rapides pour certaines tailles de lots.

Figure 2 : Performances relatives de la v0.8.1 par rapport à la v0.9.0 sur le périphérique CPU. Les performances relatives sont mesurées par (new_time/old_time)^-1.
Le code de référence est entièrement disponible pour reproductibilité. Bien que cette version apporte des améliorations significatives dans torch
pour les performances R, nous continuerons à travailler sur ce sujet et espérons améliorer encore les résultats dans les prochaines versions.
Prise en charge d’Apple Silicon
torch
La v0.9.0 peut désormais fonctionner de manière native sur les appareils équipés d’Apple Silicon. Lors de l’installation torch
à partir d’une version ARM R, torch
téléchargera automatiquement les binaires LibTorch prédéfinis qui ciblent cette plate-forme.
De plus, vous pouvez maintenant exécuter torch
opérations sur votre GPU Mac. Cette fonctionnalité est implémentée dans LibTorch via le API des shaders de performances métalliques, ce qui signifie qu’il prend en charge à la fois les appareils Mac équipés de GPU AMD et ceux équipés de puces Apple Silicon. Jusqu’à présent, il n’a été testé que sur les appareils Apple Silicon. N’hésitez pas à ouvrir un ticket si vous rencontrez des problèmes pour tester cette fonctionnalité.
Pour utiliser le GPU macOS, vous devez placer des tenseurs sur le périphérique MPS. Ensuite, les opérations sur ces tenseurs auront lieu sur le GPU. Par exemple:
x <- torch_randn(100, 100, device="mps")
torch_mm(x, x)
Si vous utilisez nn_module
s vous devez également déplacer le module vers le périphérique MPS, à l’aide du $to(device="mps")
méthode.
Notez que cette fonctionnalité est dans bêta à partir de cet article de blog, vous trouverez peut-être des opérations qui ne sont pas encore implémentées sur le GPU. Dans ce cas, vous devrez peut-être définir la variable d’environnement PYTORCH_ENABLE_MPS_FALLBACK=1
donc torch
utilise automatiquement le processeur comme solution de secours pour cette opération.
Autre
De nombreux autres petits changements ont été ajoutés dans cette version, notamment :
- Mise à jour vers LibTorch v1.12.1
- Ajoutée
torch_serialize()
pour permettre de créer un vecteur brut à partir detorch
objets. torch_movedim()
et$movedim()
sont désormais tous deux indexés en base 1.
Lire le changelog complet disponible ici.
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 (2022, Oct. 25). Posit AI Blog: torch 0.9.0. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2022-10-25-torch-0-9/
Citation BibTeX
@misc{torch-0-9-0, author = {Falbel, Daniel}, title = {Posit AI Blog: torch 0.9.0}, url = {https://blogs.rstudio.com/tensorflow/posts/2022-10-25-torch-0-9/}, year = {2022} }