﻿# Safetensors и pickle: как проверить формат весов перед загрузкой

Safetensors и pickle следует различать по механизму сериализации, а целостность конкретных весов проверять отдельно.

Автор: Команда Retrivium
Обновлено: 2026-11-01
Канонический URL: https://retrivium.ai/ru/journal/safetensors-artifact-validation/
Language: ru

Safetensors и pickle следует различать по механизму сериализации, а целостность конкретных весов проверять отдельно. Читаемый safetensors файл не доказывает правильное происхождение модели, ее качество или безопасность всего repository. Для приемки сохраните manifest, checksum и ожидаемую tensor структуру. Затем проверьте загрузку выбранным runtime. Это позволяет отделить поврежденную поставку от неподходящего формата и не считать успешное чтение файла универсальным подтверждением доверия к любому связанному коду.

## Разберите формат, а не расширение

[Руководство safetensors](https://huggingface.co/docs/safetensors/en/index) описывает формат хранения tensors и `safe_open`. Сначала установите, что loader действительно читает нужный формат, а не другой файл с похожим именем. В смешанном repository могут находиться несколько вариантов весов. Сохраните выбранные paths и index. Расширение полезно для навигации, но фактическая проверка должна открыть артефакт поддерживаемой библиотекой и подтвердить ожидаемую структуру. Не переименовывайте неизвестный binary в safetensors в надежде изменить способ его внутренней сериализации и поведение загрузчика.

## Отделите pickle execution

[Материал Hugging Face о pickle](https://huggingface.co/docs/hub/en/security-pickle) объясняет риск исполнения инструкций при десериализации и ограничения проверок происхождения. Это иной механизм, чем хранение tensors в safetensors. При этом выбор safetensors не запрещает отдельный `trust_remote_code` путь модели. Поэтому в приемочном документе сделайте две независимые строки: weight serialization и repository code loading. Снижение одного класса риска нельзя выдавать за доказательство безопасности всего окружения, dependencies и действий, которые loader может выполнять до или после чтения tensor файлов.

## Пример manifest весов

Для каждого shard укажите имя, размер, hash и ожидаемый источник. Для index сохраните mapping tensors на файлы, если он используется. После доставки пересчитайте hashes и сравните с принятым manifest. Это проверка идентичности передачи, а не доказательство, что исходная модель качественная. Если исходный checksum получен из того же непроверенного измененного источника, он не устанавливает независимую provenance. Укажите, откуда взят эталон и какая revision считалась принятой до переноса на новый узел.

## Проверьте tensor структуру

Откройте файл без запуска генерации и сопоставьте keys, shapes и dtype с ожидаемым комплектом. Возможность читать slices помогает исследовать структуру, но не заменяет проверку всех нужных shards. Если tensor отсутствует, сначала проверьте index и состав поставки. Если структура совпадает, но loader отклоняет architecture, это другая причина, которую не исправляет повторное скачивание того же файла. Сохраняйте первую содержательную ошибку, а не только финальный общий статус неудачного startup в orchestration интерфейсе.

## Завершите функциональной приемкой

После проверки формата и целостности выполните короткие known-input fixtures на поддерживаемом runtime. Отдельно сохраните code-loading policy и версии библиотек. Не делайте вывод о сохранении качества по одному правдоподобному ответу: это лишь smoke test пути загрузки и исполнения. При обновлении весов сформируйте новый manifest и повторите проверки, не заменяя эталон незаметно. Полезный итог разделяет формат, идентичность, provenance и функциональность. Такая схема позволяет назвать конкретную причину отказа и не смешивать безопасный способ хранения tensors с гарантией корректности модели, отсутствия проблем custom code или полной защищенности любой системы, в которой файл успешно открылся и вернул список ожидаемых ключей без исключения.

## Связанные материалы

[Приёмка GPU-узла: какие доказательства полезнее красивого бенчмарка](/ru/journal/gpu-acceptance-evidence/); [Воспроизводимый стек инференса: как сохранить результат GPU-пилота](/ru/journal/software-stack-reproducibility/).
