Safetensors 是 Hugging Face 推出的新一代张量存储格式,以安全、高速、零拷贝、跨框架兼容为核心优势,解决传统 Pickle/CKPT 格式的安全风险与加载慢问题。MindSpore Transformers 全面支持 Safetensors 权重的保存、加载、转换、分布式切分与合并,并深度适配昇腾 NPU 硬件,实现大模型(如 Qwen、Llama、GPT)的高效存储与极速加载。系统解析 Safetensors 原理、MindSpore 集成机制、完整代码示例与最佳实践。

一、Safetensors 核心特性与文件结构

1.1 核心优势(对比传统格式)

  • 安全无风险:纯二进制格式,不执行任何代码,杜绝 Pickle 反序列化恶意代码注入。
  • 极速加载:支持零拷贝、内存映射(mmap),比 PyTorch CKPT 快70–100 倍,大模型加载提速10 倍 +。
  • 跨框架兼容:支持 PyTorch、TensorFlow、MindSpore、NumPy 等,权重无缝迁移。
  • 元数据完整:内置张量形状、 dtype、偏移量、校验和,数据防篡改、易校验。
  • 分布式友好:原生支持分片存储、懒加载、按需读取,适配千亿级模型分布式训练。

1.2 文件结构(三部分)

  1. 文件头(Header):JSON 格式,记录版本、键值对数量、校验和。
  2. 目录页(Index):每个张量的键名、偏移量、长度、dtype、shape。
  3. 数据区(Data):纯二进制张量数据,零拷贝直接映射到内存。

1.3 权重类型(MindSpore)

  • 完整权重(Unified):单文件 / 多文件分片(如 model-00001-of-00004.safetensors)。
  • 分布式权重(Distributed):按 rank 切分(rank_0/xxx.safetensors),适配模型并行。

二、MindSpore Transformers 集成机制

2.1 核心支持能力

  • 无缝切换:配置load_ckpt_format: safetensors即可启用。
  • 自动转换:支持 Hugging Face Safetensors → MindSpore Safetensors。
  • 分布式适配:支持自动切分、合并、在线加载、懒加载。
  • NPU 优化:算子融合、内存复用、混合精度、零拷贝 NPU 直连。

2.2 关键配置项(YAML)

# 加载Safetensors权重
load_checkpoint: "/path/to/safetensors"
load_ckpt_format: "safetensors"  # 必选:ckpt/safetensors{insert\_element\_13\_}

# 分布式加载(模型并行)
use_parallel: True
auto_trans_ckpt: True  # 开启在线切分{insert\_element\_14\_}
parallel_config:
  model_parallel: 2
  pipeline_stage: 1

# 保存Safetensors权重
checkpoint_format: "safetensors"{insert\_element\_15\_}

三、实战代码(完整可运行)

3.1 环境安装(依赖)

# 安装MindSpore与Transformers
pip install "mindspore>=2.4.0"
pip install mindformers

# 安装Safetensors(兼容)
pip install safetensors

3.2 加载 Safetensors 权重(单卡)

import mindspore as ms
from mindformers import AutoModel, AutoTokenizer

# 1. 配置(YAML或代码)
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")

# 2. 加载模型与权重(Safetensors)
model = AutoModel.from_pretrained(
    "qwen2_7b",
    load_checkpoint="/path/to/qwen2_7b_safetensors",
    load_ckpt_format="safetensors",  # 关键参数{insert\_element\_16\_}
    auto_trans_ckpt=False
)

# 3. 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained("qwen2_7b")

# 4. 推理测试
inputs = tokenizer("你好,介绍一下Safetensors", return_tensors="ms")
outputs = model.generate(**inputs, max_length=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

3.3 分布式加载(多卡)

# 启动命令(8卡)
# bash scripts/msrun_launcher.sh "python load_distributed.py" 8
import mindspore as ms
from mindformers import AutoModel

ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")

# 分布式配置
parallel_config = {
    "model_parallel": 4,
    "data_parallel": 2,
    "pipeline_stage": 1
}

# 加载分布式Safetensors权重
model = AutoModel.from_pretrained(
    "qwen2_7b",
    load_checkpoint="/path/to/distributed_safetensors",
    load_ckpt_format="safetensors",
    use_parallel=True,
    auto_trans_ckpt=True,  # 自动切分{insert\_element\_17\_}
    parallel_config=parallel_config
)

3.4 保存 Safetensors 权重(训练后)

from mindformers import Trainer
from mindformers.dataset import build_dataset

# 训练配置(保存Safetensors)
trainer = Trainer(
    model=model,
    args={
        "run_mode": "finetune",
        "checkpoint_format": "safetensors",  # 保存格式{insert\_element\_18\_}
        "save_checkpoint_steps": 100,
        "output_dir": "./output"
    },
    train_dataset=build_dataset(...)
)

# 开始训练,自动保存Safetensors权重
trainer.train()

3.5 权重转换(HF → MindSpore)

# 转换脚本(官方工具)
python toolkit/safetensors/unified_safetensors.py \
  --src_dir /path/to/hf_safetensors \
  --dst_dir /path/to/ms_safetensors \
  --src_strategy_dirs /path/to/strategy \
  --file_suffix "1_1"{insert\_element\_19\_}

四、核心技术解析

4.1 零拷贝加载(Memory Mapping)

  • 直接将 Safetensors 文件映射到虚拟内存,不复制数据。
  • NPU 直连:张量直接从文件映射到 NPU 显存,无 CPU 中转。

4.2 分布式切分与合并

  • 切分:训练时按模型并行策略切分权重,保存为rank_x目录。
  • 合并:离线合并为完整权重,支持冗余保留 / 去除。

4.3 懒加载(Lazy Loading)

  • 仅加载当前需要的张量,大模型可在普通 GPU/NPU运行。

五、性能对比(关键数据)

  • 加载速度:Safetensors 比 CKPT 快50–100 倍。
  • 内存占用:零拷贝减少 **30–50%** 内存。
  • 分布式加载:8 卡加载速度提升8–10 倍。

六、常见问题与解决方案

  1. 加载失败:检查load_ckpt_format是否设为safetensors
  2. 分布式加载异常:auto_trans_ckpt=True,并配置正确并行策略。
  3. 转换失败:确认 HF 权重为Safetensors 格式,策略文件匹配。

七、总结

MindSpore Transformers 对 Safetensors 的深度集成,为大模型提供了安全、极速、分布式友好的权重解决方案。通过零拷贝、内存映射、NPU 直连、分布式切分合并,显著提升大模型的存储效率与加载速度,同时兼容主流开源模型与 Hugging Face 生态。本文提供的代码可直接用于模型加载、训练保存、权重转换,助力开发者快速构建高效、安全的大模型应用。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐