safetensors est un nouveau logiciel simple, rapide et sûr format de fichier pour stocker les tenseurs. La conception du format de fichier et son implémentation originale sont dirigées par Hugging Face, et cela devient largement adopté dans leur cadre populaire de « transformateurs ». Le package safetensors R est une implémentation pure-R, permettant à la fois de lire et d’écrire des fichiers safetensor.
La version initiale (0.1.0) de safetensors est désormais sur CRAN.
Motivation
La principale motivation des safetensors dans la communauté Python est la sécurité. Comme indiqué dans le documentation officielle:
La principale justification de cette caisse est de supprimer la nécessité d’utiliser pickle sur PyTorch qui est utilisé par défaut.
Pickle est considéré comme un format dangereux, car l’action de charger un fichier Pickle peut déclencher l’exécution de code arbitraire. Cela n’a jamais été un problème pour Torch pour les utilisateurs de R, puisque l’analyseur Pickle inclus dans LibTorch ne prend en charge qu’un sous-ensemble du format Pickle, qui n’inclut pas l’exécution de code.
Cependant, le format de fichier présente des avantages supplémentaires par rapport aux autres formats couramment utilisés, notamment :
-
Prise en charge du chargement paresseux : vous pouvez choisir de lire un sous-ensemble des tenseurs stockés dans le fichier.
-
Zéro copie : La lecture du fichier ne nécessite pas plus de mémoire que le fichier lui-même. (Techniquement, l’implémentation actuelle de R fait une seule copie, mais cela peut être optimisé si nous en avons vraiment besoin à un moment donné).
-
Simple : la mise en œuvre du format de fichier est simple et ne nécessite pas de dépendances complexes. Cela signifie que c’est un bon format pour échanger des tenseurs entre les frameworks ML et entre différents langages de programmation. Par exemple, vous pouvez écrire un fichier safetensors en R et le charger en Python, et vice versa.
Il existe des avantages supplémentaires par rapport aux autres formats de fichiers courants dans cet espace, et vous pouvez voir un tableau de comparaison ici.
Format
Le format des safetensors est décrit dans la figure ci-dessous. Il s’agit essentiellement d’un fichier d’en-tête contenant des métadonnées, suivi de tampons tenseurs bruts.
Utilisation de base
Les safetensors peuvent être installés à partir de CRAN en utilisant :
install.packages("safetensors")
Nous pouvons alors écrire n’importe quelle liste nommée de tenseurs de torche :
library(torch)
library(safetensors)
<- list(
tensors x = torch_randn(10, 10),
y = torch_ones(10, 10)
)
str(tensors)
#> List of 2
#> $ x:Float [1:10, 1:10]
#> $ y:Float [1:10, 1:10]
<- tempfile()
tmp safe_save_file(tensors, tmp)
Il est possible de transmettre des métadonnées supplémentaires au fichier enregistré en fournissant un metadata
paramètre contenant une liste nommée.
La lecture des fichiers safetensors est gérée par safe_load_file
et il renvoie la liste nommée de tenseurs avec le metadata
attribut contenant l’en-tête du fichier analysé.
<- safe_load_file(tmp)
tensors str(tensors)
#> List of 2
#> $ x:Float [1:10, 1:10]
#> $ y:Float [1:10, 1:10]
#> - attr(*, "metadata")=List of 2
#> ..$ x:List of 3
#> .. ..$ shape : int [1:2] 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int [1:2] 0 400
#> ..$ y:List of 3
#> .. ..$ shape : int [1:2] 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int [1:2] 400 800
#> - attr(*, "max_offset")= int 929
Actuellement, safetensors ne prend en charge que l’écriture de tenseurs torch, mais nous prévoyons d’ajouter la prise en charge de l’écriture de tableaux R simples et de tenseurs tensorflow à l’avenir.
Directions futures
La prochaine version de torch utilisera safetensors
comme format de sérialisation, ce qui signifie que lors de l’appel torch_save()
sur un modèle, une liste de tenseurs ou d’autres types d’objets pris en charge par torch_save
vous obtiendrez un fichier safetensors valide.
Il s’agit d’une amélioration par rapport à l’implémentation précédente car :
-
C’est beaucoup plus rapide. Plus de 10x pour les modèles de taille moyenne. Cela pourrait être encore plus pour les gros fichiers. Cela améliore également les performances des chargeurs de données parallèles d’environ 30 %.
-
Il améliore la compatibilité entre langages et entre frameworks. Vous pouvez entraîner votre modèle en R et l’utiliser en Python (et vice-versa), ou entraîner votre modèle en tensorflow et l’exécuter avec Torch.
Si vous souhaitez l’essayer, vous pouvez installer la version de développement de torch avec :
::install_github("mlverse/torch") remotes
photo par Nick Fewings 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 15). Posit AI Blog: safetensors 0.1.0. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2023-06-15-safetensors/
Citation BibTeX
@misc{safetensors, author = {Falbel, Daniel}, title = {Posit AI Blog: safetensors 0.1.0}, url = {https://blogs.rstudio.com/tensorflow/posts/2023-06-15-safetensors/}, year = {2023} }