# MindSpore分布式ckpt权重A转换为其他策略的分布式权重B

**1. 使用场景**

分布式策略改变后，训练所使用的卡数和分片策略都已改变，需要把源分布式权重转换为目标策略的分布式权重。

**2. 解决方案**

方法一：推荐转换流程

![](figures/zh-cn_image_0000002308946105.png)step1：源权重A准备

源权重存储要求：按照权重路径/rank\_x/checkpoint\_x.ckpt存储，且每个rank\_x下面只能有一个权重文件。 训练yaml配置save\_checkpoint\_steps时，训练会按照配置的值为间隔，进行权重保存，因此路径下会有多个权重

\(可选\)把需要的ckpt 权重A挪到单独的目录中,保证每个rank\_x下面只有一个ckpt文件

```
for i in {0..4095}; do mkdir -p /fs_ssd5_dpc_llm/rank_${i}; mv /path/to/old_ckpt/rank_${i}/xxxx_rank_${i}_xxx.ckpt  /path/to/new_ckpt/rank_${i}; done
```

step2：分布式策略文件合并

需要把分布式权重A、B的策略文件分别合并

```
import mindspore as ms
ms.merge_pipeline_strategys(
src_strategy_dirs="源策略文件所在的目录",
dst_strategy_file="合并后的策略文件名")
```

src\_strategy\_dirs：A或B的源策略文件,目录下面放了所有的策略文件,不需要按照rank存。

dst\_strategy\_file：合并后的策略文件,指定到策略文件名称

需要根据[https://gitee.com/mindspore/mindspore/pulls/76069/files](https://gitee.com/mindspore/mindspore/pulls/76069/files)添加改动,否则合并效率很低

脚本：

```
import mindspore as ms
ms.merge_pipeline_strategys(
src_strategy_dirs="/xxx/ckpt_convert/142strategy/",
dst_strategy_file="/xxx/ckpt_convert/142merge.ckpt")
```

输入：

![](figures/zh-cn_image_0000002274348150.png)

输出：

![](figures/zh-cn_image_0000002274291382.png)step3：权重ckpt格式转换为safetensors

把分布式的ckpt权重转换成分布式的safetensors权重

```
import mindspore as ms
ms.ckpt_to_safetensors(
file_path="ckpt文件的目录",
save_path="转换为safetensors文件的目录",
processes_num="进程数")
```

file\_path：原始权重。

分布式权重：每个rank下面一个ckpt,指定到rank的上一层路径。

完整权重：指定到权重文件。

save\_path：转换为safetensors文件的目录

processes\_num：整数,可取8,16,32等,根据自己机器内存、cpu使用情况决定

样例：

脚本：

```
import mindspore as ms
ms.ckpt_to_safetensors(
file_path="/xxx/ckpt_convert/weight_o/142distributed_ckpt",
save_path="/xxx/ckpt_convert/weight_o/142distributed_sf",
processes_num=8)
```

输入：

![](figures/zh-cn_image_0000002308950721.png)输出：

![](figures/zh-cn_image_0000002274351378.png)step4：分布式safetensors权重合并为完整safetensors分片权重

```
import mindspore as ms
ms.unified_safetensors(
src_dir="safetensors格式的文件目录",
src_strategy_file="权重A的切分策略(需合并)",
dst_dir="生成文件的目录")
```

src\_dir: safetensors分布式权重的目录

src\_strategy\_file：权重A的切分策略\(需合并\)

dst\_dir：生成文件的目录

样例

脚本：

```
import mindspore as ms
ms.unified_safetensors(
src_dir="/xxx/ckpt_convert/weight_o/142distributed_sf",
src_strategy_file="/xxx/ckpt_convert/142merge.ckpt",
dst_dir="/xxx/ckpt_convert/weight_o/142merge_sf")
```

输入：合并的策略文件

![](figures/zh-cn_image_0000002274301184.png)输入：分布式的safetensors

![](figures/zh-cn_image_0000002274303652.png)输出：

![](figures/zh-cn_image_0000002308962413.png)step5：切分safetensors权重

通过load\_distributed\_checkpoint可以将完整分片的safetensors权重转换为

1\)完整ckpt 2\)分布式ckpt 3\)完整safetensors 4）分布式safetensors

备注：输入：格式safetensors  输出：2.4.0版本输出格式只能是safetensors，2.4.0之后可以是ckpt或safetensors，默认'safetensors'

样例：8卡dp1mp4pp2转16卡dp1mp4pp4

脚本：

```
import mindspore as ms
ms.load_distributed_checkpoint(
network=None,
checkpoint_filenames=None,
predict_strategy="/xxx/ckpt_convert/144merge.ckpt",
format='safetensors',
output_format='safetensors',
unified_safetensors_dir="/xxx/ckpt_convert/weight_o/142merge_sf",
dst_safetensors_dir="/xxx/ckpt_convert/weight_o/144distributed_sf" )
```

输入：

![](figures/zh-cn_image_0000002274369150.png)输出分布式权重：

![](figures/zh-cn_image_0000002308882209.png)step6: \(2.4.0必须\) safetensors转ckpt

```
import mindspore as ms
ms.safetensors_to_ckpt(
file_path="safetensors权重文件或目录 ",
save_path="转换为ckpt文件的目录",
processes_num="进程数")
```

样例：

```
import mindspore as ms
ms.safetensors_to_ckpt(
file_path="/xxx/ckpt_convert/weight_o/sf_all",
save_path="/xxx/ckpt_convert/weight_o/sf_to_ckpt_all",
processes_num= 8)
```

输入：

![](figures/zh-cn_image_0000002308969821.png)输出完整权重截图：

![](figures/zh-cn_image_0000002274370154.png)方法二：小权重转换使用transform\_checkpoints

```
import mindspore as ms
ms.transform_checkpoints (src_checkpoints_dir, dst_checkpoints_dir, ckpt_prefix, src_strategy_file=None, dst_strategy_file=None, process_num=1, output_format='ckpt')
print("Transform ckpt DONE", flush=True)
```

src\_checkpoints\_dir:权重A的路径,分布式权重指定到rank的上一层路径,完整权重指定到文件名

dst\_checkpoints\_dir:生成权重B的路径

ckpt\_prefix：生成权重B文件名的前缀

src\_strategy\_file：权重A合并后的策略文件,对于完整权重指定None

dst\_strategy\_file：权重B合并后的策略文件,对于完整权重指定None

process\_num：线程格数,根据自己机器cpu、内存使用情况绝对

output\_format："ckpt" 或"safetensors"

