safetensors/safetensors
Simple, safe way to store and distribute tensors
safetensors – ML 텐서를 안전하고 빠르게 저장하는 포맷
무엇인가요 – safetensors는 Python 바인딩과 Rust 코어를 포함한 소규모 오픈소스 라이브러리로, Python의 pickle을 사용하지 않고 텐서(가중치, 활성화 등)를 직렬화하기 위한 바이너리 파일 포맷을 정의합니다. 포맷은 의도적으로 단순합니다: 각 텐서를 설명하는 작은 JSON 헤더와 연속된 바이트 버퍼로 구성됩니다. 헤더에는 실행 가능한 코드가 포함되지 않기 때문에 파일은 안전하게 공유하고 로드할 수 있습니다.
왜 중요한가요 – 딥러닝 워크플로우에서 모델 가중치는 종종 큰 바이너리 블롭으로 전달됩니다. 기본 PyTorch 포맷(.pt/pickle)은 로드 시 임의의 코드를 실행할 수 있어, 인터넷에서 모델을 다운로드하는 사용자에게 보안 위험이 있습니다. safetensors는 이러한 위험을 제거하면서도 다음 기능을 제공합니다:
- 제로 코피 읽기 – 바이트 버퍼를 직접 메모리 매핑하여 텐서로 로드할 수 있어 CPU에서 추가 복사 없이 처리 가능합니다.
- 지연 로딩 – 헤더를 확인하고 필요한 텐서만 로드할 수 있어 분산 또는 멀티 GPU 추론에 유용합니다.
- 크기 제한 없음 – 기가바이트 규모의 모델에도 적용 가능합니다.
- 최신 dtype 지원 (bfloat16, fp8 등).
주요 기능 (README에 기술됨)
| 기능 | 작동 방식 |
|---|---|
| 안전성 | 헤더는 순수한 JSON; 로드 시 코드 실행 없음. |
| 제로 코피 | 텐서 데이터는 연속적으로 저장되며, 라이브러리가 직접 매핑 가능 (torch.UntypedStorage.from_file). |
| 지연 로딩 | 헤더에 각 텐서의 바이트 오프셋이 기록되어 있어 전체 파일을 스캔하지 않고도 단일 텐서만 읽을 수 있음. |
| 레이아웃 제어 | 생성자가 파일 내 텐서의 순서를 결정할 수 있어 빠른 랜덤 액세스 가능. |
| 무제한 파일 크기 | 일부 protobuf 기반 포맷에 있는 2 GiB 제한 없음. |
| bfloat16 / fp8 지원 | 네이티브 dtype 코드가 사양에 포함됨. |
설치
# Python 패키지 (가장 일반적인 사용)
pip install safetensors
소스에서 빌드하려면 Rust 툴체인이 필요합니다:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust 설치
git clone https://github.com/huggingface/safetensors
cd safetensors/bindings/python
pip install setuptools_rust
pip install -e .
빠른 시작 예제 (Python)
import torch
from safetensors import safe_open
from safetensors.torch import save_file
# 디스크에 두 개의 텐서 저장
weights = {
"weight1": torch.zeros((1024, 1024)),
"weight2": torch.zeros((1024, 1024)),
}
save_file(weights, "model.safetensors")
# 지연 로딩으로 다시 읽기
tensors = {}
with safe_open("model.safetensors", framework="pt", device="cpu") as f:
for key in f.keys():
tensors[key] = f.get_tensor(key)
safe_open 컨텍스트는 헤더를 쿼리할 수 있는 가벼운 핸들(f.keys())을 반환하며, 필요한 텐서만 가져올 수 있습니다.
파일 포맷 기본 사항
- 처음 8바이트 – 리틀엔디안 부호 없는 정수
N(JSON 헤더 길이). - 다음
N바이트 – UTF-8로 인코딩된 JSON 객체. 텐서 이름에서{dtype, shape, data_offsets}로의 매핑. - 나머지 바이트 – 연속된 텐서 데이터.
- 선택적
__metadata__항목은 임의의 문자열 키/값 쌍을 저장할 수 있음. - 중복 키 없음, 바이트 버퍼에 빈 공간 없음, 모든 데이터는 리틀엔디안 행 우선(row-major).
ML 생태계에서의 위치
- Hugging Face 모델 허브에서 대규모 언어 모델 가중치를 안전하게 배포하는 데 사용.
- PyTorch, TensorFlow, NumPy 등과 언어별 바인딩(코어는 Rust이지만 Python이 주요 진입점)으로 호환.
- 안전성과 빠른 랜덤 액세스가 필요한 경우, Pickle, HDF5, ONNX protobuf, MsgPack, NumPy
.npz등의 대안으로 사용.
라이선스 – Apache-2.0 (허용성 높고 상용 사용에 적합).
- 위 정보는 리포지토리의 README에서 직접 인용되었으며, 추가 기능은 추측되지 않았습니다.*
관련
- Dispatch
- Dispatch
- 프로젝트
- Dispatch
- Dispatch