Safetensors documentation
Analyse des métadonnées
Analyse des métadonnées
Compte tenu de la simplicité du format, il est très simple et efficace de récupérer et d’analyser les métadonnées relatives aux poids Safetensors – c’est-à-dire la liste des tenseurs, leurs types et leurs formes ou nombres de paramètres – à l’aide de petites requêtes HTTP (Range).
Cette analyse a été implémentée en JS dans huggingface.js (un exemple de code suit ci-dessous), mais elle serait similaire dans n’importe quel langage.
Cas d'utilisation d'exemple
Il peut exister de nombreux cas d'utilisation potentiels. Par exemple, nous l'utilisons sur le HuggingFace Hub pour afficher des informations sur les modèles qui possèdent des poids au format safetensors :


Utilisation
Depuis 🤗 Hub, vous pouvez obtenir les métadonnées d'un modèle via des requêtes HTTP range au lieu de télécharger le fichier safetensors complet avec tous les poids. Dans le script python ci-dessous (vous pouvez utiliser n'importe quel langage prenant en charge les requêtes HTTP), nous analysons les métadonnées de gpt2.
import requests # pip install requests
import struct
def parse_single_file(url):
# Fetch the first 8 bytes of the file
headers = {'Range': 'bytes=0-7'}
response = requests.get(url, headers=headers)
# Interpret the bytes as a little-endian unsigned 64-bit integer
length_of_header = struct.unpack('<Q', response.content)[0]
# Fetch length_of_header bytes starting from the 9th byte
headers = {'Range': f'bytes=8-{7 + length_of_header}'}
response = requests.get(url, headers=headers)
# Interpret the response as a JSON object
header = response.json()
return header
url = "https://huggingface.co/gpt2/resolve/main/model.safetensors"
header = parse_single_file(url)
print(header)
# {
# "__metadata__": { "format": "pt" },
# "h.10.ln_1.weight": {
# "dtype": "F32",
# "shape": [768],
# "data_offsets": [223154176, 223157248]
# },
# ...
# }Utiliser huggingface.js
import { parseSafetensorsMetadata } from "@huggingface/hub";
const info = await parseSafetensorsMetadata({
repo: { type: "model", name: "bigscience/bloom" },
});
console.log(info)
// {
// sharded: true,
// index: {
// metadata: { total_size: 352494542848 },
// weight_map: {
// 'h.0.input_layernorm.bias': 'model_00002-of-00072.safetensors',
// ...
// }
// },
// headers: {
// __metadata__: {'format': 'pt'},
// 'h.2.attn.c_attn.weight': {'dtype': 'F32', 'shape': [768, 2304], 'data_offsets': [541012992, 548090880]},
// ...
// }
// }Selon que les poids safetensors sont répartis en plusieurs fichiers ou non, la sortie de l'appel ci-dessus sera :
export type SafetensorsParseFromRepo =
| {
sharded: false;
header: SafetensorsFileHeader;
}
| {
sharded: true;
index: SafetensorsIndexJson;
headers: SafetensorsShardedHeaders;
};où les types sous-jacents sont les suivants :
type FileName = string;
type TensorName = string;
type Dtype = "F64" | "F32" | "F16" | "BF16" | "I64" | "I32" | "I16" | "I8" | "U8" | "BOOL";
interface TensorInfo {
dtype: Dtype;
shape: number[];
data_offsets: [number, number];
}
type SafetensorsFileHeader = Record<TensorName, TensorInfo> & {
__metadata__: Record<string, string>;
};
interface SafetensorsIndexJson {
weight_map: Record<TensorName, FileName>;
}
export type SafetensorsShardedHeaders = Record<FileName, SafetensorsFileHeader>;huggingface_hub fournit une API Python pour analyser les métadonnées safetensors.
Utilisez get_safetensors_metadata pour obtenir toutes les métadonnées safetensors d'un modèle.
Selon que le modèle est sharded ou non, un ou plusieurs fichiers safetensors seront analysés.
>>> from huggingface_hub import get_safetensors_metadata
# Parse repo with single weights file
>>> metadata = get_safetensors_metadata("bigscience/bloomz-560m")
>>> metadata
SafetensorsRepoMetadata(
metadata=None,
sharded=False,
weight_map={'h.0.input_layernorm.bias': 'model.safetensors', ...},
files_metadata={'model.safetensors': SafetensorsFileMetadata(...)}
)
>>> metadata.files_metadata["model.safetensors"].metadata
{'format': 'pt'}
# Parse repo with sharded model (i.e. multiple weights files)
>>> metadata = get_safetensors_metadata("bigscience/bloom")
Parse safetensors files: 100%|██████████████████████████████████████████| 72/72 [00:12<00:00, 5.78it/s]
>>> metadata
SafetensorsRepoMetadata(metadata={'total_size': 352494542848}, sharded=True, weight_map={...}, files_metadata={...})
>>> len(metadata.files_metadata)
72 # All safetensors files have been fetched
# Parse repo that is not a safetensors repo
>>> get_safetensors_metadata("runwayml/stable-diffusion-v1-5")
NotASafetensorsRepoError: 'runwayml/stable-diffusion-v1-5' is not a safetensors repo. Couldn't find 'model.safetensors.index.json' or 'model.safetensors' files.Pour analyser les métadonnées d'un fichier safetensors unique, utilisez parse_safetensors_file_metadata.
Exemple de sortie
Par exemple, voici le nombre de paramètres par dtype pour quelques modèles sur le HuggingFace Hub. Consultez également cette issue pour d'autres exemples d'utilisation.
| model | safetensors | params |
|---|---|---|
| gpt2 | fichier unique | { ‘F32’ => 137022720 } |
| roberta-base | fichier unique | { ‘F32’ => 124697433, ‘I64’ => 514 } |
| Jean-Baptiste/camembert-ner | fichier unique | { ‘F32’ => 110035205, ‘I64’ => 514 } |
| roberta-large | fichier unique | { ‘F32’ => 355412057, ‘I64’ => 514 } |
| distilbert-base-german-cased | fichier unique | { ‘F32’ => 67431550 } |
| EleutherAI/gpt-neox-20b | shardé | { ‘F16’ => 20554568208, ‘U8’ => 184549376 } |
| bigscience/bloom-560m | fichier unique | { ‘F16’ => 559214592 } |
| bigscience/bloom | shardé | { ‘BF16’ => 176247271424 } |
| bigscience/bloom-3b | fichier unique | { ‘F16’ => 3002557440 } |