Safetensors é um formato de modelo notável, concebido para armazenar tensores de forma segura, oferecendo velocidade e desempenho impressionantes em comparação com muitas das alternativas existentes. Safetensors não é apenas incrivelmente rápido, como também foi projetado com simplicidade e segurança no seu núcleo, o que o distingue de muitos formatos tradicionais utilizados em machine learning.
Por Que Escolher Safetensors?
Com uma panóplia de formatos disponíveis para machine learning e armazenamento de dados, poderá questionar-se o que distingue o Safetensors. Vejamos alguns destes formatos para entender como o Safetensors se destaca em parâmetros cruciais:
- Seguro: Um ficheiro descarregado aleatoriamente não executará código arbitrário?
- Cópia zero: A leitura do ficheiro exige mais memória do que o ficheiro original?
- Carregamento preguiçoso: É possível inspecionar o ficheiro sem carregar tudo? E é possível carregar apenas alguns tensores sem digitalizar todo o ficheiro (importante num contexto distribuído)?
- Controlo de layout: É possível controlar a localização dos tensores dentro do ficheiro para garantir um acesso rápido a tensores individuais?
- Sem limite de tamanho de ficheiro: Existe um limite para o tamanho do ficheiro?
- Flexibilidade: É possível guardar código personalizado no formato e utilizá-lo mais tarde sem código adicional?
- Bfloat16: O formato suporta bfloat16 nativo sem necessidade de soluções estranhas?
Cada símbolo ✔ representa a presença, ❌ a ausência, ~ presença parcial e ? presença desconhecida de uma funcionalidade.
Formato | Seguro | Cópia zero | Carregamento preguiçoso | Sem limite de tamanho de ficheiro | Controlo de layout | Flexibilidade | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
A partir desta comparação, pode constatar que o Safetensors cumpre ou supera as funcionalidades oferecidas por outros formatos de modelo. É particularmente notável pela sua capacidade de manipulação de dados com “cópia zero” e carregamento preguiçoso, o que pode aumentar significativamente a eficiência do processamento de dados em tarefas de machine learning.
Algumas Comparações Notáveis
Embora todos os formatos tenham os seus pontos fortes únicos, analisemos como o Safetensors se comporta em comparação com alguns dos mais comuns:
- Pickle (PyTorch): Um formato amplamente utilizado, mas o pickle tem uma desvantagem significativa – não é seguro, pois permite a execução de código arbitrário.
- H5 (Tensorflow): Embora seguro, não suporta a cópia zero, uma funcionalidade essencial para a manipulação eficiente de dados.
- SavedModel (Tensorflow): Este formato é específico do Tensorflow e carece de flexibilidade para outras aplicações.
- Numpy (npz): Embora popular, este formato não suporta bfloat16, uma funcionalidade cada vez mais crucial no mundo do ML.
Por Dentro do Safetensors
Aprofundando um pouco mais o Safetensors, verificamos que não é apenas um formato de dados, mas uma combinação de escolhas de design ponderadas que melhoram a segurança, a eficiência e a utilidade:
- Cópia zero: O design do Safetensors permite uma verdadeira cópia zero na CPU se o ficheiro já estiver na cache. Na GPU, embora uma cópia seja sempre necessária devido à ausência de uma cache de disco, o design evita a necessidade de alocar todos os tensores na CPU em qualquer ponto.
- Endianness: O Safetensors utiliza a ordenação little-endian, uma escolha popular no armazenamento de dados.
- Ordem: Adota a ordenação ‘C’ ou por linhas. Esta escolha está alinhada com o padrão prevalecente no armazenamento de dados.
- Stride: O striding não é suportado. Todos os tensores precisam de ser empacotados antes de serem serializados. Esta decisão de design foi tomada com base nos padrões de utilização atuais em formatos serializados.
A Milha Extra
Para além de ser simplesmente um formato de armazenamento de dados eficiente e seguro, o Safetensors também traz algumas vantagens adicionais:
- Prevenção de ataques DoS: O design do Safetensors mitiga a possibilidade de ficheiros maliciosos causarem ataques DoS. Existe um limite no tamanho do cabeçalho para evitar a análise de JSON extremamente grandes e existe uma garantia de que os endereços no ficheiro não se sobrepõem, o que significa que carregar um ficheiro nunca deve exceder o tamanho do ficheiro na memória.
- Carregamento mais rápido: O Safetensors ignora a cópia extra da CPU no PyTorch, permitindo tempos de carregamento da CPU extremamente rápidos em comparação com o pickle. Os tempos de carregamento da GPU são tão rápidos ou mais rápidos do que o seu equivalente PyTorch.
- Carregamento preguiçoso: Em configurações distribuídas (vários nós ou várias GPUs), o Safetensors permite carregar apenas parte dos tensores, acelerando significativamente os tempos de carregamento do modelo e melhorando os ciclos de feedback de desenvolvimento.
Em Utilização
O Safetensors já está a ser amplamente adotado em empresas líderes de IA como a Hugging Face, EleutherAI, e StabilityAI. Vários projetos proeminentes que utilizam Safetensors incluem:
- huggingface/transformers
- AUTOMATIC1111/stable-diffusion-webui
- Llama-cpp
- microsoft/TaskMatrix
- hpcaitech/ColossalAI
- huggingface/pytorch-image-models
- CivitAI
- huggingface/diffusers
- coreylowman/dfdx
- invoke-ai/InvokeAI
- oobabooga/text-generation-webui
- Sanster/lama-cleaner
- PaddlePaddle/PaddleNLP
- AIGC-Audio/AudioGPT
- brycedrennan/imaginAIry
- comfyanonymous/ComfyUI
- LianjiaTech/BELLE
Em conclusão, o Safetensors, com o seu conjunto único de funcionalidades e vantagens, está preparado para mudar o panorama no mundo do machine learning e do armazenamento de dados. Por isso, avance e experimente – o futuro dos formatos de modelo espera por si!