Safetensors – это замечательный формат моделей, разработанный для безопасного хранения тензоров, отличающийся впечатляющей скоростью и производительностью по сравнению со многими альтернативами в этой области. Safetensors не только невероятно быстр, но и разработан с акцентом на простоту и безопасность, что выгодно отличает его от многих традиционных форматов, используемых в машинном обучении.
Почему стоит выбрать Safetensors?
При изобилии форматов, доступных для машинного обучения и хранения данных, вы можете задаться вопросом, что же выделяет Safetensors. Давайте потратим немного времени на сравнение некоторых из этих форматов, чтобы понять, как Safetensors проявляет себя по ключевым параметрам:
- Безопасность: Не запустит ли случайно скачанный файл произвольный код?
- Zero-copy (нулевое копирование): Потребуется ли для чтения файла больше памяти, чем размер исходного файла?
- Ленивая загрузка: Можно ли просмотреть файл, не загружая все содержимое? И можно ли загрузить только некоторые тензоры из него, не сканируя весь файл (важно в распределенной среде)?
- Управление размещением: Можно ли контролировать расположение тензоров внутри файла, чтобы обеспечить быстрый доступ к отдельным тензорам?
- Отсутствие ограничения на размер файла: Есть ли ограничение на размер файла?
- Гибкость: Можно ли сохранить пользовательский код в формате и использовать его позже без дополнительного кода?
- Bfloat16: Поддерживает ли формат нативный bfloat16 без необходимости в странных обходных путях?
Каждый символ ✔ означает наличие функции, ❌ – отсутствие, ~ – частичное наличие, а ? – неизвестное наличие.
Формат | Безопасность | Zero-copy | Ленивая загрузка | Отсутствие ограничения на размер файла | Управление размещением | Гибкость | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
Из этого сравнения видно, что Safetensors соответствует или превосходит функции, предлагаемые другими форматами моделей. Особенно примечательны его возможности «zero-copy» обработки данных и ленивой загрузки, которые могут значительно повысить эффективность обработки данных в задачах машинного обучения.
Некоторые примечательные сравнения
Хотя все форматы имеют свои уникальные сильные стороны, давайте рассмотрим, как Safetensors выглядит на фоне некоторых из наиболее часто используемых:
- Pickle (PyTorch): Широко используемый формат, но pickle имеет существенный недостаток – он небезопасен, поскольку допускает выполнение произвольного кода.
- H5 (Tensorflow): Хоть и безопасен, но не поддерживает zero-copy, функцию, неотъемлемую для эффективной обработки данных.
- SavedModel (Tensorflow): Этот формат специфичен для Tensorflow и не обладает гибкостью для других применений.
- Numpy (npz): Будучи популярным, этот формат не поддерживает bfloat16, что становится все более важной функцией в мире машинного обучения.
Что скрывается под капотом Safetensors
Погружаясь немного глубже в Safetensors, мы обнаруживаем, что это не просто формат данных, а сочетание продуманных конструктивных решений, которые повышают безопасность, эффективность и полезность:
- Zero-copy: Дизайн Safetensors обеспечивает настоящее zero-copy на CPU, если файл уже находится в кэше. На GPU, хотя копирование всегда необходимо из-за отсутствия дискового кэша, конструкция обходит необходимость выделять все тензоры на CPU в какой-либо момент времени.
- Порядок байтов (Endianness): Safetensors использует прямой порядок байтов (little-endian), популярный выбор в хранении данных.
- Порядок (Order): Он использует ‘C’ или построчный порядок (row-major ordering). Этот выбор соответствует распространенному стандарту в хранении данных.
- Шаг (Stride): Шаги не поддерживаются. Все тензоры должны быть упакованы перед сериализацией. Это конструктивное решение было принято на основе текущих моделей использования в сериализованных форматах.
Дополнительные преимущества
Помимо того, что Safetensors является эффективным и безопасным форматом хранения данных, он также привносит ряд дополнительных преимуществ:
- Предотвращение DOS-атак: Конструкция Safetensors снижает вероятность того, что вредоносные файлы вызовут DOS-атаки. Существует ограничение на размер заголовка, чтобы предотвратить разбор чрезвычайно большого JSON, и есть гарантия, что адреса в файле не перекрываются, что означает, что загрузка файла никогда не должна превышать размер файла в памяти.
- Более быстрая загрузка: Safetensors обходит дополнительное копирование на CPU в PyTorch, обеспечивая чрезвычайно быстрое время загрузки на CPU по сравнению с pickle. Время загрузки на GPU такое же быстрое или быстрее, чем у эквивалента PyTorch.
- Ленивая загрузка: В распределенных средах (многоузловых или много-GPU) Safetensors позволяет загружать только часть тензоров, что значительно ускоряет время загрузки моделей и улучшает циклы обратной связи при разработке.
В реальных условиях
Safetensors уже получает широкое распространение в ведущих AI-компаниях, таких как Hugging Face, EleutherAI, и StabilityAI. Некоторые известные проекты, использующие Safetensors, включают:
- 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
В заключение, Safetensors, с его уникальным набором функций и преимуществ, готов стать революционным решением в мире машинного обучения и хранения данных. Так что, дерзайте и испытайте его – будущее форматов моделей ждет вас!