Safetensors documentation
Phân tích cú pháp Metadata
Phân tích cú pháp Metadata
Nhờ sự đơn giản của định dạng, việc lấy và phân tích metadata về trọng số Safetensors – tức là danh sách các tensor, kiểu của chúng và hình dạng hoặc số lượng tham số của chúng – bằng các (Range) HTTP requests nhỏ là rất đơn giản và hiệu quả.
Việc phân tích này đã được triển khai bằng JS trong huggingface.js (mã mẫu được đưa ra bên dưới), nhưng nó sẽ tương tự trong bất kỳ ngôn ngữ nào.
Ví dụ về trường hợp sử dụng
Có thể có nhiều trường hợp sử dụng tiềm năng. Ví dụ, chúng tôi sử dụng nó trên HuggingFace Hub để hiển thị thông tin về các model có trọng số safetensors:


Cách sử dụng
Từ 🤗 Hub, bạn có thể lấy metadata của một model bằng HTTP range requests thay vì tải toàn bộ file safetensors chứa tất cả các weights. Trong script python dưới đây (bạn có thể dùng bất kỳ ngôn ngữ nào hỗ trợ HTTP requests), chúng ta đang parse metadata của 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]
# },
# ...
# }Sử dụng 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]},
// ...
// }
// }Tùy thuộc vào việc trọng số safetensors có được chia thành nhiều tệp hay không, kết quả của lệnh gọi ở trên sẽ là:
export type SafetensorsParseFromRepo =
| {
sharded: false;
header: SafetensorsFileHeader;
}
| {
sharded: true;
index: SafetensorsIndexJson;
headers: SafetensorsShardedHeaders;
};trong đó types cơ bản là các loại sau:
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 cung cấp API Python để phân tích metadata của safetensors.
Sử dụng get_safetensors_metadata để lấy toàn bộ metadata safetensors của một model.
Tùy thuộc vào việc model có được chia shard hay không, một hoặc nhiều tệp safetensors sẽ được phân tích.
>>> 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.Để phân tích metadata của một tệp safetensors đơn lẻ, hãy sử dụng parse_safetensors_file_metadata.
Ví dụ về kết quả
Ví dụ, dưới đây là số lượng tham số theo từng dtype cho một số mô hình trên HuggingFace Hub. Xem thêm vấn đề này để biết các ví dụ sử dụng khác.
| model | safetensors | params |
|---|---|---|
| gpt2 | một tệp | { ‘F32’ => 137022720 } |
| roberta-base | một tệp | { ‘F32’ => 124697433, ‘I64’ => 514 } |
| Jean-Baptiste/camembert-ner | một tệp | { ‘F32’ => 110035205, ‘I64’ => 514 } |
| roberta-large | một tệp | { ‘F32’ => 355412057, ‘I64’ => 514 } |
| distilbert-base-german-cased | một tệp | { ‘F32’ => 67431550 } |
| EleutherAI/gpt-neox-20b | chia mảnh | { ‘F16’ => 20554568208, ‘U8’ => 184549376 } |
| bigscience/bloom-560m | một tệp | { ‘F16’ => 559214592 } |
| bigscience/bloom | chia mảnh | { ‘BF16’ => 176247271424 } |
| bigscience/bloom-3b | một tệp | { ‘F16’ => 3002557440 } |