Safetensors는 텐서를 안전하게 저장하기 위해 설계된 뛰어난 모델 형식으로, 이 분야의 다른 대안들에 비해 인상적인 속도와 성능을 자랑합니다. Safetensors는 매우 빠를 뿐만 아니라 단순성과 안전성을 핵심으로 설계되어 머신러닝에서 사용되는 많은 기존 형식과 차별화됩니다.
Safetensors를 선택해야 하는 이유?
머신러닝 및 데이터 저장을 위해 사용할 수 있는 다양한 형식이 있는데, Safetensors가 다른 형식과 차별화되는 이유는 무엇일까요? Safetensors가 제공하는 주요 매개변수를 이해하기 위해 이러한 형식들을 잠시 비교해 보겠습니다.
- 안전성: 무작위로 다운로드한 파일이 임의의 코드를 실행하지 않을까요?
- 제로 카피: 파일을 읽는 데 원본 파일보다 더 많은 메모리가 필요할까요?
- 느린 로딩: 모든 것을 로드하지 않고 파일을 검사할 수 있을까요? 그리고 전체 파일을 스캔하지 않고 일부 텐서만 로드할 수 있을까요(분산 환경에서 중요)?
- 레이아웃 제어: 개별 텐서에 대한 빠른 액세스를 보장하기 위해 파일 내에서 텐서의 위치를 제어할 수 있을까요?
- 파일 크기 제한 없음: 파일 크기에 제한이 있을까요?
- 유연성: 사용자 정의 코드를 형식으로 저장하고 추가 코드 없이 나중에 사용할 수 있을까요?
- Bfloat16: 이 형식은 이상한 해결 방법 없이 기본 bfloat16을 지원할까요?
각 기호 ✔는 기능의 존재, ❌는 부재, ~는 부분적 존재, ?는 기능의 알 수 없음을 나타냅니다.
형식 | 안전성 | 제로 카피 | 느린 로딩 | 파일 크기 제한 없음 | 레이아웃 제어 | 유연성 | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
이 비교에서 Safetensors가 다른 모델 형식이 제공하는 기능을 충족하거나 능가한다는 것을 알 수 있습니다. 특히 ‘제로 카피’ 데이터 조작 및 느린 로딩 기능은 머신러닝 작업에서 데이터 처리 효율성을 크게 향상시킬 수 있다는 점에서 주목할 만합니다.
주목할 만한 몇 가지 비교
모든 형식에는 고유한 강점이 있지만, Safetensors가 더 일반적으로 사용되는 형식과 비교하여 어떤지 살펴보겠습니다.
- Pickle (PyTorch): 널리 사용되는 형식이지만, pickle은 임의의 코드 실행을 허용하므로 안전하지 않다는 심각한 단점이 있습니다.
- H5 (Tensorflow): 안전하지만 효율적인 데이터 조작에 필수적인 기능인 제로 카피를 지원하지 않습니다.
- SavedModel (Tensorflow): 이 형식은 Tensorflow에만 해당되며 다른 애플리케이션에 대한 유연성이 부족합니다.
- Numpy (npz): 널리 사용되지만, 이 형식은 ML 세계에서 점점 더 중요해지는 기능인 bfloat16을 지원하지 않습니다.
Safetensors의 내부 구조
Safetensors를 좀 더 자세히 살펴보면 단순한 데이터 형식이 아니라 안전성, 효율성 및 유용성을 향상시키는 사려 깊은 설계 선택의 조합임을 알 수 있습니다.
- 제로 카피: Safetensors 설계는 파일이 이미 캐시에 있는 경우 CPU에서 실제 제로 카피를 허용합니다. GPU에서는 디스크 캐시가 없기 때문에 항상 복사본이 필요하지만, 이 설계는 특정 시점에 CPU에 모든 텐서를 할당할 필요가 없습니다.
- 엔디언: Safetensors는 데이터 저장에 널리 사용되는 리틀 엔디언 순서를 사용합니다.
- 순서: ‘C’ 또는 행 우선 순서를 채택합니다. 이 선택은 데이터 저장의 일반적인 표준과 일치합니다.
- 스트라이드: 스트라이딩은 지원되지 않습니다. 직렬화하기 전에 모든 텐서를 패킹해야 합니다. 이 설계 결정은 직렬화된 형식의 현재 사용 패턴을 기반으로 이루어졌습니다.
특별한 노력
단순히 효율적이고 안전한 데이터 저장 형식을 넘어 Safetensors는 몇 가지 추가적인 이점도 제공합니다.
- DOS 공격 방지: Safetensors의 설계는 악성 파일로 인한 DOS 공격 가능성을 완화합니다. 매우 큰 JSON 구문 분석을 방지하기 위해 헤더 크기에 제한이 있으며, 파일의 주소가 겹치지 않도록 보장하므로 파일을 로드하는 데 메모리에서 파일 크기를 초과하지 않아야 합니다.
- 더 빠른 로드: Safetensors는 PyTorch에서 추가 CPU 복사를 우회하여 pickle에 비해 CPU 로드 시간이 매우 빠릅니다. GPU 로드 시간은 PyTorch와 동일하거나 더 빠릅니다.
- 느린 로딩: 분산 환경(다중 노드 또는 다중 GPU)에서 Safetensors는 텐서의 일부만 로드할 수 있으므로 모델 로드 시간을 크게 단축하고 개발 피드백 루프를 개선합니다.
실제 사용
Safetensors는 이미 Hugging Face, EleutherAI 및 StabilityAI와 같은 주요 AI 기업에서 널리 채택되고 있습니다. 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는 고유한 기능과 이점을 통해 머신러닝 및 데이터 저장 분야에서 판도를 바꿀 준비가 되었습니다. 자, 어서 사용해 보세요. 모델 형식의 미래가 여러분을 기다립니다!