ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • safetensors 파일이면 모델을 안심하고 내려받아도 될까
    AI Agent 2026. 9. 23. 09:04
    728x90
    반응형

    나무 구슬이 담긴 밀폐 유리병, 옆의 종이 두루마리와 상자
    안전한 저장 형식과 주변 구성 요소를 구분하는 AI 생성 개념 이미지입니다.

    safetensors는 텐서 저장 형식의 안전성으로 이해하고 모델 코드·설정·출처 검토는 별도로 하세요.

    모델 파일 이름이 .safetensors로 끝나면 안심하고 실행해도 될까요. pickle 형식의 역직렬화 위험을 줄이기 위해 만든 포맷이라는 점은 중요합니다. 하지만 모델 저장소에 함께 있는 코드와 실행 환경, 모델의 출력까지 모두 신뢰할 수 있다는 뜻은 아닙니다.

    무엇을 안전하게 읽는지와 무엇을 실제로 실행하는지를 나눠야 합니다. 이 글은 2026년 9월 13일 Safetensors와 Transformers의 공식 문서·보안 정책을 기준으로 검토 범위를 설명합니다. 의심스러운 파일을 내려받거나 모델 코드와 악성 예제를 실행하지 않았습니다.

    포맷이 해결하는 문제부터 좁혀 봅니다

    pickle은 Python 객체를 저장하고 복원하는 형식입니다. 신뢰할 수 없는 데이터를 역직렬화하면 임의 코드 실행으로 이어질 수 있어 출처를 모르는 pickle을 열지 말라는 주의가 필요합니다. safetensors는 이런 범용 객체 복원 대신 텐서 데이터를 저장하고 읽기 위한 형식입니다. Safetensors의 목적, pickle의 위험

    safetensors 파일에는 텐서 이름, 데이터 형식, shape와 데이터 위치 등을 담은 헤더와 텐서 바이트가 있습니다. 일반적인 Python 객체를 복원하기 위해 임의 함수를 호출하는 pickle의 기능을 제공하는 형식이 아닙니다. 공식 파일 구조

    이렇게 텐서 데이터 읽기와 Python 객체 복원을 분리하면 피할 수 있는 위험이 있습니다. 다만 그 경계는 텐서를 읽는 포맷에 관한 것이므로, 같은 저장소에서 설치 스크립트나 모델 구현 코드를 실행하는 행위까지 덮지는 않습니다.

    확장자만 바꾼 파일이 올바른 safetensors가 되는 것도 아닙니다. 실제 내용은 파서가 형식과 구조를 확인해야 합니다. 파일 이름을 보는 단계와 검토한 도구로 파일을 해석하는 단계를 구분합니다.

    모델 저장소에는 가중치 말고도 여러 파일이 있습니다

    가상의 저장소에 다음 파일이 있다고 하겠습니다. 특정 공개 모델의 실제 파일 목록이 아니라 검토 범위를 나누기 위한 예시입니다.

    model.safetensors
    config.json
    tokenizer.json
    tokenizer_config.json
    modeling_custom.py
    README.md
    

    model.safetensors는 가중치 텐서를 담는 후보입니다. config.json은 모델 구성을, 토크나이저 관련 파일은 입력을 토큰으로 변환하는 데 필요한 정보를 담을 수 있습니다. modeling_custom.py는 실행될 수 있는 Python 구현 코드입니다. README의 설치 명령 역시 실행 전에 별도로 읽어야 합니다.

    여기서 가중치 파일이 safetensors라는 사실은 modeling_custom.py의 내용을 검토했다는 증거가 아닙니다. 저장소를 통째로 신뢰하는 것과 가중치의 직렬화 포맷을 선택하는 것은 다른 판단입니다.

    또한 설정이 JSON이라고 실행 전체가 저위험이라는 결론도 성립하지 않습니다. 설정은 어떤 모델 클래스와 파일, 크기를 사용할지에 영향을 줄 수 있고, 로더와 연결돼 해석됩니다. 단순한 파일 형식 표시만으로 실행 경로 전체를 판단하지 않습니다.

    실제로 사용할 파일과 사용하지 않을 파일을 구분해 두면 검토 범위를 설명하기 쉬워집니다. 존재하는 모든 파일이 자동 실행된다고 과장할 필요도 없고, 가중치만 읽었다는 이유로 나머지를 승인한 것처럼 기록할 필요도 없습니다.

    use_safetensors와 trust_remote_code는 별개의 선택입니다

    Transformers의 보안 정책은 가중치 형식으로 safetensors를 권장하며 use_safetensors를 사용해 해당 형식이 없을 때 로딩 오류로 멈추는 경로를 안내합니다. 다른 형식으로 조용히 넘어가지 않게 하려는 목적입니다. Transformers의 원격 파일 보안 정책

    trust_remote_code는 모델 저장소의 사용자 정의 구현 코드를 사용할지에 관한 다른 옵션입니다. 사용자 정의 모델을 불러올 때 True가 필요할 수 있으며, 공식 문서는 해당 코드를 검토하고 리비전을 고정하는 주의를 설명합니다. 사용자 정의 모델 로딩

    따라서 use_safetensors=True와 trust_remote_code=True를 함께 쓴다면 “가중치는 safetensors로 읽고 외부 모델 코드도 허용한다”는 두 결정을 한 것입니다. 첫 번째 옵션이 두 번째의 위험을 없애 주지는 않습니다.

    반대로 trust_remote_code=False를 유지했는데 모델이 사용자 정의 코드를 요구해 멈췄다면, 오류를 없애려고 바로 True로 바꾸지 않습니다. 현재 라이브러리에 내장된 구현으로 지원되는 모델인지, 왜 외부 코드가 필요한지, 그 코드를 검토할 수 있는지 확인할 지점입니다.

    False 하나가 설치된 Python 환경 전체를 샌드박스로 만드는 것도 아닙니다. 이미 설치된 패키지와 로더는 여전히 실행됩니다. 옵션은 특정 로딩 경로의 허용 여부이지 운영체제 수준의 완전 격리가 아닙니다.

    두 상황을 검수 카드로 비교해 봅니다

    첫 번째 가상 상황은 알려진 배포자의 특정 리비전에서 가중치와 토크나이저를 받고, 사용하는 Transformers에 모델 구현이 내장돼 있는 경우입니다. 가중치 형식을 safetensors로 제한하고 외부 모델 코드 허용 없이 로딩할 수 있는지 확인하는 경로를 검토할 수 있습니다.

    이때도 파일 출처와 리비전, 로더 버전, 필요한 메모리와 사용 조건을 기록합니다. “safetensors 확인” 하나로 완료하지 않고, 어떤 파일을 어떤 구현으로 읽을지까지 묶어야 다음에 같은 환경을 다시 만들 수 있습니다.

    두 번째는 같은 확장자의 가중치가 있지만 README에서 별도의 패키지 설치와 사용자 정의 코드 실행을 요구하는 경우입니다. 텐서 포맷은 확인할 수 있어도 설치 코드와 모델 코드 검토가 끝나지 않았다면 실행 승인을 보류합니다.

    이 두 경우의 차이는 확장자가 아니라 추가 실행 경로입니다. 가중치 파일의 이름이 같다는 이유로 첫 번째 상황의 판단을 두 번째에 재사용하지 않습니다. 필요한 코드 검토를 할 수 없다면 이미 지원되는 다른 모델을 선택하는 것도 실제 대안입니다.

    검토 결과는 “안전함”이라는 단일 문장보다 “파일 출처·리비전 확인, safetensors 가중치 확인, 외부 코드 미사용” 또는 “외부 코드 검토 미완료로 로딩 보류”처럼 확인한 범위를 적는 편이 명확합니다.

    해시와 스캔은 무엇을 확인했는지 정확히 읽습니다

    파일 해시는 받은 바이트가 비교 대상과 같은지 확인하는 데 도움이 됩니다. 그러나 신뢰할 수 없는 출처에서 파일과 해시를 함께 받아 둘이 맞는다고 확인해도 그 배포자의 신뢰성이 생기는 것은 아닙니다. 무엇을 기준값으로 신뢰했는지가 먼저입니다.

    리비전을 고정하면 검토 뒤 저장소가 바뀌어 다른 코드가 로드되는 위험을 줄이는 데 도움이 됩니다. 하지만 고정한 리비전 자체를 검토하지 않았다면 악성일 수 있는 상태를 그대로 고정한 것일 뿐입니다. 같은 파일을 다시 받는 것과 그 파일이 사용 목적에 적합한지는 다릅니다.

    Hub의 스캔 표시도 전체 코드 감사와 같은 의미로 읽지 않습니다. Hugging Face의 pickle 스캔 문서는 검사가 완전하지 않으며, 안전·위험 목록을 관리하더라도 모든 Python 패키지를 안전성 감사하는 것은 아니라는 한계를 명시합니다. 스캔 결과의 한계

    경고가 있다면 확인 없이 넘기지 않고, 경고가 없더라도 검토할 내용이 사라졌다고 보지 않습니다. 출처·고정 버전·형식·코드 검토는 서로 보완하는 근거이지 하나가 나머지를 대체하는 체크박스가 아닙니다.

    텐서를 읽을 수 있다는 것과 모델이 정상이라는 것도 다릅니다

    포맷이 유효하더라도 텐서 값과 모델 동작의 품질까지 보장하는 것은 아닙니다. Safetensors의 공식 구조 설명은 텐서 값에 NaN이나 무한대가 들어 있을 수 있으며 값 자체를 검사하지 않는다고 밝힙니다. 텐서 값의 검증 범위

    따라서 로딩 성공과 정상적인 추론 결과는 별도로 확인해야 합니다. 모델이 예상한 구성과 dtype을 갖는지, 입력이 해당 토크나이저와 맞는지, 출력에 비정상 값이나 목적과 맞지 않는 동작이 있는지 살펴볼 필요가 있습니다.

    메모리 요구량도 별개입니다. 포맷이 임의 코드 실행을 막는 방향으로 설계됐더라도 정상적으로 큰 모델을 내 장비에 올릴 수 있다는 뜻은 아닙니다. 가중치 외에 실행 중 메모리가 필요하므로 파일 크기 하나만으로 사용 가능성을 확정하지 않습니다.

    출력의 편향이나 부정확성, 원치 않는 행동은 모델 평가의 영역입니다. safetensors를 사용했다는 사실로 모델이 항상 올바르게 답하거나 특정 지시를 안전하게 처리한다고 주장할 수 없습니다.

    실행 전후를 나누면 판단이 덜 흐려집니다

    실행 전에는 배포자와 리비전, 실제로 사용할 파일, 설치·모델 코드, 로더 버전, 사용 조건을 확인합니다. 라이선스의 구체적인 사용 가능 범위가 불명확하면 별도 확인 대상으로 남기고, 이 글의 파일 포맷 설명으로 법적 판단을 대신하지 않습니다.

    초기 실행은 민감한 토큰이나 업무 자료가 없는 제한된 환경에서 작은 공개 입력으로 검토하는 편이 좋습니다. 불필요한 네트워크·파일 권한을 줄일 수 있는지 살펴보되, 단순히 폴더를 하나 새로 만들었다는 이유로 격리됐다고 생각하지 않습니다.

    실행 후에는 로딩된 파일과 구성, 사용한 장치·메모리, 실제 출력이 기대 범위인지 확인합니다. 이 글에서는 이런 실행을 수행하지 않았으므로 특정 모델의 보안이나 품질을 승인하지 않습니다.

    safetensors는 텐서 파일을 읽는 위험을 줄이는 중요한 선택입니다. 그 이점을 인정하면서도 저장소의 코드와 실행 권한, 모델의 동작을 별도로 검토해야 합니다. 확장자를 확인한 뒤의 질문은 “이제 전부 믿어도 되나”가 아니라 “내가 추가로 무엇을 실행하려고 하며, 그 부분은 확인했나”입니다.

    728x90
    반응형
Designed by Tistory.