Hugging Face와 같은 AI 모델 허브를 돌아다니다 보면, 과거에 흔히 보던 .bin이나 .pth 파일 대신 .safetensors라는 확장자를 가진 파일들이 점점 더 많이 보이기 시작했습니다.
이 포스트에서는 .safetensors가 도대체 무엇인지, 왜 등장했는지, 그리고 기존 방식 대비 어떤 강력한 장점이 있는지 기술적인 관점에서 상세히 알아보겠습니다.
1. .safetensors란 무엇인가?
.safetensors는 Hugging Face가 개발한 새로운 텐서(Tensor) 저장 포맷입니다.
딥러닝 모델은 수십억 개의 파라미터(가중치, Weights)로 구성되어 있는데, 이 거대한 숫자 뭉치들을 파일로 저장하고 불러오는 역할을 합니다. 기존에 사실상의 표준으로 사용되던 Python의 pickle 모듈에 기반한 저장 방식의 치명적인 단점(보안 및 속도)을 해결하기 위해 만들어졌습니다.
간단히 말해, "더 안전하고, 더 빠른 모델 저장 파일" 입니다.
2. 왜 등장했는가: 기존 방식(Pickle)의 문제점
기존 PyTorch 모델(.bin, .pth)은 내부적으로 Python의 pickle 모듈을 사용하여 데이터를 직렬화(Serialization)합니다. 하지만 pickle에는 치명적인 문제가 있습니다.
보안 취약점 (Arbitrary Code Execution)
pickle은 단순히 데이터를 저장하는 것이 아니라, Python 객체 자체를 저장합니다. 이 과정에서 파이썬 코드를 포함할 수 있는데, 악의적인 해커가 모델 파일 내부에 시스템을 망가뜨리거나 개인 정보를 탈취하는 코드를 심어놓을 수 있습니다. 사용자가 무심코 모델을 load() 하는 순간, 해당 악성 코드가 실행됩니다.
문제 상황 예시:
사용자가 인터넷에서 다운로드한 model.bin을 로드함 -> 파일 내부에 숨겨진 코드가 실행됨 -> 사용자의 SSH 키나 비밀번호가 해커 서버로 전송됨.
.safetensors는 이러한 보안 위협을 원천 차단하기 위해 등장했습니다.
3. .safetensors의 핵심 특징
3.1. 안전성 (Safety)
.safetensors는 이름 그대로 안전합니다. 이 포맷은 순수한 텐서 데이터와 메타데이터(JSON 형태)만을 저장합니다. 실행 가능한 코드가 들어갈 공간이 전혀 없기 때문에, 신뢰할 수 없는 출처에서 다운로드한 파일이라도 안심하고 로드할 수 있습니다.
3.2. 제로 카피 (Zero-Copy) 및 속도
대용량 LLM(거대언어모델)이나 Stable Diffusion 모델을 로딩할 때 속도가 획기적으로 빠릅니다.
-
기존 방식: 파일을 CPU 메모리로 복사 -> 역직렬화(Unpickling) -> 다시 텐서 형태로 변환 -> GPU로 이동. (불필요한 복사 과정 발생)
-
safetensors: 메모리 매핑(Memory Mapping, mmap) 기술을 활용합니다. 운영체제가 파일 자체를 메모리 주소에 직접 매핑하므로, 불필요한 복사 과정 없이 디스크에서 데이터를 즉시 사용할 수 있습니다. 이를 Zero-Copy라고 합니다.
3.3. 레이지 로딩 (Lazy Loading)
전체 모델을 메모리에 다 올리지 않고, 필요한 부분만 선택적으로 빠르게 읽어올 수 있습니다.
예를 들어, 100GB짜리 모델 파일에서 특정 레이어의 가중치만 확인하고 싶다면, 기존 방식은 100GB를 다 읽어야 했지만 .safetensors는 해당 부분만 콕 집어 읽을 수 있습니다. 분산 학습 환경이나 추론 최적화 시 매우 유리합니다.
3.4. 프레임워크 호환성
특정 딥러닝 프레임워크(PyTorch 등)에 종속되지 않습니다.
-
PyTorch
-
TensorFlow
-
JAX
-
PaddlePaddle
위와 같은 다양한 프레임워크에서 모두 쉽게 읽고 쓸 수 있도록 설계되었습니다.
4. 파일 구조
.safetensors 파일은 매우 단순한 구조를 가지고 있습니다.
-
헤더 (Header): 파일의 앞부분에 위치하며 JSON 형식을 따릅니다. 각 텐서의 이름, 데이터 타입(dtype), 형태(shape), 그리고 데이터가 저장된 위치(offset) 정보를 담고 있습니다.
-
데이터 (Data): 헤더 뒤에 이어지는 바이너리 데이터 덩어리입니다. 순수한 텐서 값들이 빽빽하게 채워져 있습니다.
이러한 구조 덕분에 파일을 다 읽지 않고 헤더만 읽어서 모델의 구조를 파악하는 것도 가능합니다.
4-1. 실전 팁: 터미널에서 헤더 및 메타데이터 확인하기
다운로드한 .safetensors 파일이 양자화된 모델인지, 혹은 어떤 레이어들이 포함되어 있는지 확인하기 위해 수 기가바이트가 넘는 모델을 다 로드하는 것은 비효율적입니다.
safetensors 라이브러리는 전체 파일을 읽지 않고 헤더 정보만 빠르게 스캔할 수 있는 기능을 제공합니다. 터미널에서 다음과 같은 Python One-liner(한 줄 명령어) 를 입력하면 즉시 확인이 가능합니다.
물론 hugging face 의 모델을 다운로드 받은 페이지에 가면 우측 상단에 file info 를 클릭해서 확인할 수도 있습니다. 그러나 여기서는 내 터미널에서 직접 확인하는 법을 설명해 보겠습니다.
사전 준비
먼저 라이브러리가 설치되어 있어야 합니다.
pip install safetensors
명령어 (터미널 입력)
model.safetensors 자리에 실제 파일 경로를 입력하세요.
python -c "from safetensors import safe_open; \
with safe_open('model.safetensors', framework='pt', device='cpu') as f: \
print('--- Metadata ---'); \
print(f.metadata()); \
print('\n--- Tensor Keys (Layers) ---'); \
print(list(f.keys())[:5])" # 너무 기니까 상위 5개만 출력
출력 결과 해석
이 명령어를 실행하면 두 가지 중요한 정보를 얻을 수 있습니다.
-
Metadata: 모델 제작자가 심어둔 정보입니다. 여기에
format: gptq또는quantization: int4같은 정보가 적혀 있다면, 파일명에 써있지 않아도 양자화된 모델임을 알 수 있습니다. (단, 제작자가 메타데이터를 비워뒀다면None이 뜰 수 있습니다.) -
Keys: 모델을 구성하는 레이어의 이름들입니다. 이를 통해 모델의 구조를 파악할 수 있습니다.
5. 비교 요약: .bin (Pickle) vs .safetensors
| 특징 | .bin / .pth (Pickle 기반) | .safetensors |
|---|---|---|
| 보안 | 위험 (악성 코드 실행 가능) | 안전 (데이터만 저장) |
| 로딩 속도 | 느림 (CPU 부하 발생) | 매우 빠름 (Zero-Copy) |
| 메모리 효율 | 전체 로드 필요 | 필요한 만큼만 로드 (Lazy Loading) |
| 호환성 | Python/PyTorch 의존적 | 프레임워크 독립적 |
6. 사용 예제 (Python)
safetensors 라이브러리를 사용하여 텐서를 저장하고 불러오는 간단한 예제입니다.
import torch
from safetensors.torch import save_file, load_file
# 1. 텐서 생성 및 저장
tensors = {
"embedding": torch.zeros((1024, 512)),
"attention": torch.rand((512, 512))
}
# 딕셔너리 형태의 텐서를 파일로 저장
save_file(tensors, "model.safetensors")
# 2. 파일 불러오기
loaded = load_file("model.safetensors")
print(loaded["embedding"].shape)
# 출력: torch.Size([1024, 512])
7. 결론
.safetensors는 단순한 파일 확장자의 변화가 아니라, AI 모델의 보안과 효율성을 위한 필수적인 진화입니다. Hugging Face를 비롯한 주요 커뮤니티에서는 이미 기본 포맷으로 자리 잡고 있습니다.
앞으로 모델을 다운로드하거나 배포할 때는 가급적 .bin 대신 .safetensors를 사용하는 것을 권장합니다. 보안 위협으로부터 안전하고, 모델 로딩 시간도 획기적으로 단축될 것입니다.

댓글이 없습니다.