【案例】【Mindspore】【离线权重转换系列一】safetensors格式权重和ckpt格式权重互转
收藏回复举报
【案例】【Mindspore】【离线权重转换系列一】safetensors格式权重和ckpt格式权重互转
发表于2024-12-31 10:39:08
0 查看

safetensors格式的权重分两种:一种是hugginface下载的safetensors格式,一种是mindspore支持的转换的safetensors。 两种虽然都是safetensors格式,但权重名称格式不一样。

场景一:safetensors转换为ckpt权重

1. 从huggingface下载的完整分片safetensors转分布式ckpt、完整ckpt

转换流程如下:

cke_23577.png

step1: 转name: 把huggingface的权重名称转换成mindspore的名称

huggingface和MindSpore的命名规则不一致,因此需要转name,转name后的输出结果和方法"unified_safetensors"的输出结果格式是一样的

转name可参考代码:     https://gitee.com/cooingA/mindspore/blob/convert_weight/convert_weight.py

输出:和unified_safetensors输出格式一样

cke_78376.png

step2:切分safetensors权重

通过"load_distributed_checkpoint"方法可以将完整分片的safetensors权重转换为:

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

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

import mindspore as ms
ms.load_distributed_checkpoint(
network=None, #可以不是None,直接传入Net
predict_strategy="权重B的策略文件(合并后)", #完整权重指定None
format='safetensors', #默认是ckpt,取值ckpt或safetensors
output_format='ckpt', #默认是'safetensors',取值ckpt或safetensors,2.4.0之后可以使用
unified_safetensors_dir="离线合并后的目录(上一步产生的)",
dst_safetensors_dir="生成的权重B目录" )

样例:完整分片的safetensors转完整单个权重

import mindspore as ms
ms.load_distributed_checkpoint(
network=None,
checkpoint_filenames=None,
predict_strategy=None,
format='safetensors',
output_format='safetensors',
unified_safetensors_dir="/xxx/ckpt_convert/weight_o/convert_name",
dst_safetensors_dir="/xxx/ckpt_convert/weight_o/sf_to_ckpt_all" )

输入:

cke_222098.png

输出完整权重截图:

cke_239423.png

step3:(2.4.0必须) safetensors转ckpt

使用方法

import mindspore as ms
ms.safetensors_to_ckpt(
file_path="safetensor权重文件或目录 ",
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)

输入:

cke_284567.png

输出完整权重截图:

cke_316175.png

2. 分布式safetensors转分布式ckpt

接口safetensors_to_ckpt可以实现如下

  1. 分布式safetensors权重转到分布式的ckpt权重(源目录必须按rank存储)
  2. 完整的单个safetensors权重转换到完整的单个ckpt权重(源目录必须按rank存储)
  3. 完整分片的safetensors权重转换到多个ckpt权重(需要指定到单个safetensores文件,转换后需要合并ckpt然后进行切分)

使用方法

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

file_path:源权重,包含 safetensors 文件的目录路径或单个 safetensors 文件 (.safetensors) 的路径。备注:指定目录时必须按照rank存储

save_path:转换为ckpt文件的目录

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

样例:只使用了一个rank进行转换,源目录指定到了rank的上一层路径

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)

输入:

cke_372627.png

输出:

cke_395170.png

场景二:ckpt转换为safetensors权重

1. 把分布式ckpt或者完整ckpt权重转换成分布式或完整的safetensors权重,都可以使用ckpt_to_safetensors进行转换

接口ckpt_to_safetensors可以实现如下功能:

  1. 分布式ckpt权重转到分布式safetensors的权重(源目录必须按rank存储)
  2. 完整的单个ckpt权重转换到完整的单个safetensors权重(源目录必须按rank存储)
  3. 完整分片的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使用情况决定

样例1:完整ckpt转完整safetensors,指定到文件

import mindspore as ms
ms.ckpt_to_safetensors(
file_path="/xxx/ckpt_convert/weight_o/net.ckpt",
save_path="/xxx/ckpt_convert/weight_o/ckpt_to_sf_all/",
processes_num=8)

输入:

cke_1470800.png

输出:

cke_839111.png

样例2:指定目录按照rank存储

import mindspore as ms
ms.ckpt_to_safetensors(
file_path="/xxx/ckpt_convert/weight_o/sf_to_ckpt_all/",
save_path="/xxx/ckpt_convert/weight_o/ckpt_to_sf_all/",
processes_num=8)

输入:

cke_887831.png

输出:

cke_1488049.png

2. ckpt转Huggingface的safetensors

重要: 除了使用ckpt_to_safetensors以外,还需要进行name反向替换(可参考前面的正向替换代码,进行反向替换)

本帖最后由 匿名用户 于 2025/04/30 10:07:20 编辑

我要发帖子