safetensors é um novo, simples, rápido e seguro formato de arquivo para armazenar tensores. O design do formato de arquivo e sua implementação unique estão sendo liderados pela Hugging Face, e está ficando amplamente adotado em seu widespread framework ‘transformers’. O pacote R safetensors é uma implementação R pura, permitindo ler e escrever arquivos safetensor.
A versão inicial (0.1.0) do safetensors agora está no CRAN.
Motivação
A principal motivação para os safetensors na comunidade Python é a segurança. Conforme observado no documentação oficial:
A principal justificativa para essa caixa é eliminar a necessidade de usar pickle no PyTorch, que é usado por padrão.
Pickle é considerado um formato inseguro, pois a ação de carregar um arquivo Pickle pode disparar a execução de código arbitrário. Isso nunca foi uma preocupação para usuários do torch para R, já que o analisador Pickle que está incluído no LibTorch suporta apenas um subconjunto do formato Pickle, que não inclui a execução de código.
No entanto, o formato de arquivo tem vantagens adicionais sobre outros formatos comumente usados, incluindo:
Suporte para carregamento lento: você pode escolher ler um subconjunto dos tensores armazenados no arquivo.
Cópia zero: a leitura do arquivo não requer mais memória do que o próprio arquivo. (Tecnicamente, a implementação atual do R faz uma única cópia, mas isso pode ser otimizado se realmente precisarmos em algum momento).
Simples: Implementar o formato de arquivo é simples e não requer dependências complexas. Isso significa que é um bom formato para trocar tensores entre frameworks de ML e entre diferentes linguagens de programação. Por exemplo, você pode escrever um arquivo safetensors em R e carregá-lo em Python, e vice-versa.
Existem vantagens adicionais em comparação com outros formatos de arquivo comuns neste espaço, e você pode ver uma tabela de comparação aqui.
Formatar
O formato safetensors é descrito na figura abaixo. É basicamente um arquivo de cabeçalho contendo alguns metadados, seguidos por buffers tensor brutos.
Uso básico
Os tensores de segurança podem ser instalados pelo CRAN usando:
set up.packages("safetensors")
Podemos então escrever qualquer lista nomeada de tensores de tocha:
library(torch)
library(safetensors)
<- listing(
tensors x = torch_randn(10, 10),
y = torch_ones(10, 10)
)
str(tensors)
#> Record of two
#> $ x:Float (1:10, 1:10)
#> $ y:Float (1:10, 1:10)
<- tempfile()
tmp safe_save_file(tensors, tmp)
É possível passar metadados adicionais para o arquivo salvo fornecendo um metadata
parâmetro contendo uma lista nomeada.
A leitura dos arquivos safetensors é feita por safe_load_file
e retorna a lista nomeada de tensores junto com o metadata
atributo contendo o cabeçalho do arquivo analisado.
<- safe_load_file(tmp)
tensors str(tensors)
#> Record of two
#> $ x:Float (1:10, 1:10)
#> $ y:Float (1:10, 1:10)
#> - attr(*, "metadata")=Record of two
#> ..$ x:Record of three
#> .. ..$ form : int (1:2) 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int (1:2) 0 400
#> ..$ y:Record of three
#> .. ..$ form : int (1:2) 10 10
#> .. ..$ dtype : chr "F32"
#> .. ..$ data_offsets: int (1:2) 400 800
#> - attr(*, "max_offset")= int 929
Atualmente, o safetensors suporta apenas a escrita de tensores torch, mas planejamos adicionar suporte para a escrita de matrizes R simples e tensores tensorflow no futuro.
Direções futuras
A próxima versão do Torch usará safetensors
como seu formato de serialização, o que significa que ao chamar torch_save()
em um modelo, lista de tensores ou outros tipos de objetos suportados por torch_save
você obterá um arquivo safetensors válido.
Esta é uma melhoria em relação à implementação anterior porque:
É muito mais rápido. Mais de 10x para modelos de médio porte. Pode ser ainda mais para arquivos grandes. Isso também melhora o desempenho de carregadores de dados paralelos em ~30%.
Ele aprimora a compatibilidade entre linguagens e frameworks. Você pode treinar seu modelo em R e usá-lo em Python (e vice-versa), ou treinar seu modelo em tensorflow e executá-lo com torch.
Se você quiser experimentar, pode instalar a versão de desenvolvimento do torch com:
::install_github("mlverse/torch") remotes
Foto por Nick Fewings sobre Desaparecer
Reutilizar
Texto e figuras são licenciados sob Artistic Commons Attribution CC BY 4.0. As figuras que foram reutilizadas de outras fontes não se enquadram nesta licença e podem ser reconhecidas por uma nota na legenda: “Figura de …”.
Citação
Para atribuição, cite este trabalho 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ção BibTeX
@misc{safetensors, writer = {Falbel, Daniel}, title = {Posit AI Weblog: safetensors 0.1.0}, url = {https://blogs.rstudio.com/tensorflow/posts/2023-06-15-safetensors/}, yr = {2023} }