safetensors es una herramienta nueva, sencilla, rápida y segura formato de archivo para almacenar tensores. El diseño del formato de archivo y su implementación authentic está a cargo de Hugging Face, y se está volviendo cada vez más adoptado en gran medida en su fashionable marco de ‘transformadores’. El paquete Safetensor R es una implementación pura de R, que permite leer y escribir archivos Safetensor.
La versión inicial (0.1.0) de los tensores de seguridad ahora está en CRAN.
Motivación
La principal motivación para los tensores de seguridad en la comunidad Python es la seguridad. Como se señala en el documentación oficial:
El motivo principal de esta caja es eliminar la necesidad de utilizar pickle en PyTorch, que se utiliza de forma predeterminada.
Pickle se considera un formato inseguro, ya que la acción de cargar un archivo Pickle puede desencadenar la ejecución de código arbitrario. Esto nunca ha sido una preocupación para los usuarios de R, ya que el analizador Pickle que se incluye en LibTorch solo admite un subconjunto del formato Pickle, que no incluye la ejecución de código.
Sin embargo, el formato de archivo tiene ventajas adicionales sobre otros formatos de uso común, que incluyen:
-
Soporte para carga diferida: puede optar por leer un subconjunto de los tensores almacenados en el archivo.
-
Copia cero: leer el archivo no requiere más memoria que el archivo mismo. (Técnicamente, la implementación precise de R hace una sola copia, pero se puede optimizar si realmente la necesitamos en algún momento).
-
Easy: implementar el formato de archivo es easy y no requiere dependencias complejas. Esto significa que es un buen formato para intercambiar tensores entre marcos de ML y entre diferentes lenguajes de programación. Por ejemplo, puede escribir un archivo de tensores de seguridad en R y cargarlo en Python, y viceversa.
Existen ventajas adicionales respecto a otros formatos de archivos habituales en este espacio, y puedes ver una tabla comparativa aquí.
Formato
El formato de los tensores de seguridad se describe en la siguiente figura. Básicamente es un archivo de encabezado que contiene algunos metadatos, seguidos de búferes tensoriales sin formato.
Uso básico
Los tensores de seguridad se pueden instalar desde CRAN usando:
set up.packages("safetensors")
Luego podemos escribir cualquier lista con nombre de tensores de antorcha:
library(torch)
library(safetensors)
<- record(
tensors x = torch_randn(10, 10),
y = torch_ones(10, 10)
)
str(tensors)
#> Checklist of two
#> $ x:Float [1:10, 1:10]
#> $ y:Float [1:10, 1:10]
<- tempfile()
tmp safe_save_file(tensors, tmp)
Es posible pasar metadatos adicionales al archivo guardado proporcionando un metadata
parámetro que contiene una lista con nombre.
La lectura de archivos de tensores de seguridad está a cargo de safe_load_file
y devuelve la lista nombrada de tensores junto con el metadata
atributo que contiene el encabezado del archivo analizado.
<- safe_load_file(tmp)
tensors str(tensors)
#> Checklist of two
#> $ x:Float [1:10, 1:10]
#> $ y:Float [1:10, 1:10]
#> - attr(*, "metadata")=Checklist of two
#> ..$ x:Checklist of three
#> .. ..$ form : int [1:2] 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int [1:2] 0 400
#> ..$ y:Checklist of three
#> .. ..$ form : int [1:2] 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int [1:2] 400 800
#> - attr(*, "max_offset")= int 929
Actualmente, los tensores de seguridad solo admiten la escritura de tensores de antorcha, pero planeamos agregar soporte para escribir matrices R simples y tensores de flujo tensor en el futuro.
Direcciones futuras
La próxima versión de la antorcha utilizará safetensors
como su formato de serialización, lo que significa que al llamar torch_save()
en un modelo, lista de tensores u otros tipos de objetos soportados por torch_save
obtendrá un archivo de tensores de seguridad válido.
Esta es una mejora con respecto a la implementación anterior porque:
-
Es mucho más rápido. Más de 10 veces para modelos de tamaño mediano. Podría ser incluso más para archivos grandes. Esto también mejora el rendimiento de los cargadores de datos paralelos en aproximadamente un 30 %.
-
Mejora la compatibilidad entre idiomas y marcos. Puede entrenar su modelo en R y usarlo en Python (y viceversa), o entrenar su modelo en tensorflow y ejecutarlo con torch.
Si quieres probarlo, puedes instalar la versión de desarrollo de torch con:
::install_github("mlverse/torch") remotes
Foto por Nick Fewings en desempaquetar
Reutilizar
El texto y las figuras tienen licencia Artistic Commons Attribution. CC POR 4.0. Las figuras que han sido reutilizadas de otras fuentes no están cubiertas por esta licencia y pueden reconocerse por una nota en su pie de foto: “Figura de…”.
Citación
Para atribución, cite este trabajo como
Falbel (2023, June 15). Posit AI Weblog: safetensors 0.1.0. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2023-06-15-safetensors/
Cita BibTeX
@misc{safetensors, creator = {Falbel, Daniel}, title = {Posit AI Weblog: safetensors 0.1.0}, url = {https://blogs.rstudio.com/tensorflow/posts/2023-06-15-safetensors/}, 12 months = {2023} }