gem5 : 多个checkpoint聚合后运行Multiprogrammed workloads

本文介绍如何使用gem5自带工具checkpoint_aggregator.py聚合多个独立Checkpoint,并解决在聚合后运行时出现的错误。同时提供了升级Checkpoint的方法以适配gem5的新版本。

参考:Multiprogrammed workloadsRunning Gem5 with multiple independent checkpoints

问题:

  • 通过checkpoint单独运行SPEC2k6 benchmark时,可以正常运行;
  • 现在假设有4个workload,那么他们各自会有自己的checkpoint,那么如何让他们一起运行呢?

解决方法:
1. gem5中自带的工具util/checkpoint_aggregator.py可以很好的将多个checkpoint聚合成一个运行点。方法如下:

python checkpoint_aggregator.py -o cpt.1 --cpts cpt.2339843762000 cpt.2441406262000 --memory-size 8589934592

2.从上面生成的checkpoint处开始运行4个workloads // running Gem5 using merged checkpoint

/home/fandroid/gem5/build/ALPHA/gem5.debug --debug-flags=CacheDead --debug-file=/home/fandroid/gem5/m5out/trace.out --outdir=/home/fandroid/gem5/m5out /home/fandroid/gem5/configs/example/spec06_l3_4mix_se.py --benchmark=mix1 -n 4 -r 1 --cpu-type=detailed --cpu-clock=2GHz --mem-size=4GB --mem-channels=2 --mem-type=LPDDR3_1600_x32 --caches --l1i_size=32kB --l1i_assoc=8 --l1d_size=32kB --l1d_assoc=8 --l2cache --l2_size=256kB --l2_assoc=8 --l3cache --l3_size=2MB --l3_assoc=32 --part=32

3.运行上面的脚本后会出现如下错误:

"fatal: Can't unserialize 'Globals:numMainEventQueues'" 

由于我使用的是2013年的gem5稳定版,存在一定的bug,最新的开发版本已经修复该问题。见补丁:sim: bump checkpoint version for multiple event queues
要修正这个问题,需要将gem5版本更新到最新,然后在通过util/cpt_upgrader.py工具将之前的cpt.1文件更新即可。

这是一个非常好的问题! 当你使用 Hugging Face 的 `Trainer` 进行训练后,发现保存的 **checkpoint 被分成了多个文件**(如 `pytorch_model-00001-of-00003.bin`, `pytorch_model-00002-of-00003.bin` 等),这其实是 **模型参数过大导致自动分片(sharding)的结果**。 --- ## ✅ 为什么会分成多个部分?根本原因如下: ### 🔍 原因 1:**模型太大,单个文件无法安全加载或传输** 现代大语言模型(如 LLaMA-7B、Mistral、Qwen 等)的参数量高达数十 GB。如果把所有权重存成一个 `.bin` 文件: - ❌ 单文件 > 10GB,GitHub 不支持 - ❌ 下载容易中断,恢复困难 - ❌ 某些操作系统对单文件大小有限制 - ❌ 加载时内存峰值过高 👉 所以 Hugging Face 引入了 **模型分片(Model Sharding)机制**,将模型权重拆分为多个小文件。 --- ## 🧩 示例结构 ```bash checkpoint-500/ ├── pytorch_model-00001-of-00003.bin ├── pytorch_model-00002-of-00003.bin ├── pytorch_model-00003-of-00003.bin ├── config.json ├── tokenizer_config.json ├── special_tokens_map.json └── training_args.bin ``` > 表示这个 checkpoint 的模型权重被分成了 **3 个文件** --- ## 💡 它是怎么实现的? Hugging Face 使用的是 `torch.save()` 和 `safetensors`(可选)结合 **张量切分策略** 来实现分片。 ### 核心逻辑流程: 1. 计算所有参数总大小(例如 13GB) 2. 设置每个分片最大体积(默认 ~10GB) 3. 将 `state_dict` 中的张量按顺序分配到不同文件中 4. 保证同一个 layer 的参数尽量在同一个 shard 中(提高加载效率) > ⚠️ 注意:不是“每个 layer 一个文件”,而是“按体积打包” --- ## ✅ 如何控制是否分片?如何设置分片数量? 你可以通过 `TrainingArguments` 控制这一行为。 ### 方法 1:禁用分片(所有权重保存为一个文件) ```python from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./results", save_strategy="steps", save_steps=500, # 👇 关键参数 save_safetensors=False, # 可选:是否使用 safetensors max_shard_size="10GB", # 默认值;设更大则减少分片数 # 或者完全关闭分片: max_shard_size="50GB", # 超大阈值 → 实际不分片 ) ``` #### 常见选项: - `"5GB"`、`"10GB"`、`"1TB"`(单位支持 GB/MB) - `"10GB"` 是默认值 --- ### 方法 2:强制分成 N 个等份(高级用法) 虽然不能直接指定“分成 5 份”,但可以通过估算模型大小来设置 `max_shard_size`。 例如你的模型约 15GB,想分成 3 份 → 设 `max_shard_size="6GB"` --- ## ✅ 加载这种分片模型会受影响吗? 不会!Hugging Face 的 `AutoModel.from_pretrained()` **自动识别并合并分片**: ```python from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("./checkpoint-500") # ✅ 自动读取所有 pytorch_model-*.bin 并拼接 ``` 无需手动操作,完全透明。 --- ## 🛠 高级技巧:查看每个 shard 包含哪些层 虽然 Transformers 不提供内置工具,但你可以这样分析: ```python import torch # 读取某个 shard shard = torch.load("pytorch_model-00001-of-00003.bin", map_location="cpu") print("该 shard 包含的键:") for k in shard.keys(): print(k) ``` 输出可能类似: ``` transformer.h.0.attn.q_proj.weight transformer.h.0.attn.k_proj.weight ... transformer.h.5.mlp.dense_h_to_4h.weight ``` 可以看到它包含了前几个 transformer 层。 --- ## ✅ 分片 vs DeepSpeed/ZeRO 的区别? | 类型 | 目的 | 是否分布式 | |------|------|-----------| | **Checkpoint 分片** | 方便存储和下载 | 单机可用 | | **ZeRO 分片(DeepSpeed)** | 训练时显存优化 | 分布式训练 | > ✅ Checkpoint 分片只是“保存格式”,不影响运行性能。 --- ## ✅ 最佳实践建议 | 场景 | 推荐设置 | |------|----------| | 小模型(<1B 参数) | `max_shard_size="10GB"`(默认即可) | | 大模型微调(7B+) | 保持分片,便于上传 HF Hub | | 想要单一文件导出 | 设置 `max_shard_size="50GB"` | | 发布模型到 HuggingFace | 保留分片(HF Hub 支持更好) | --- ## 📦 额外提示:使用 `safetensors` 更安全高效 推荐开启: ```python save_safetensors=True ``` 优点: - 更快加载 - 更低内存占用 - 防止恶意代码执行(`.bin` 是 pickle,有风险) 输出变为: ``` model-00001-of-00003.safetensors ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值