问题描述:

【功能模块】

分布式保存的模型转存

【操作步骤&问题现象】

1、前提:代码修改自PanGu-Alpha,训练中是采用了数据并行、模型并行,并开启了优化器并行,因此所有保存的CheckPoint才是一个完整的模型。我们想把这些ckpt合并成一个完整的权重文件。

2、我们看到官方文档会有一份合并示例,但是盘古模型似乎用不了这种方法,见下图1。如果将 load_checkpoint 和load_param_into_net改为load_distributed_checkpoint,等模型加载完参数后,再获取权重的值并保存,能得到一份完整的权重文件吗?

3、另外一个更好的方向是,我能通过读取strategy.ckpt,手动合并CheckPoint吗?那么parallel_layouts里面的参数该怎样理解?见注释2。

 

注释 2:

param_name: "backbone.blocks.1.attention.dense1.weight"

parallel_layouts {

  dev_matrix {

    dim: 4

    dim: 2

  }

  tensor_map {

    dim: 0

    dim: -1

  }

  param_split_shape {

  }

  indices_offset {

  }

  field: 0

  opt_weight_shard_step: 2

  opt_weight_shard_size: -1

}

解答:

建议把rank0和rank1的ckpt合并、rank2和rank3的ckpt合并、rank4和rank5的ckpt合并、rank6和rank7的ckpt合并,然后再load_ckpt

通过context.set_auto_parallel_context配置分布式推断,只不过是单卡的分布式推断,然后通过load_distributed_checkpoint 加载分布式模型到单卡,在成功加载模型之后,再导出完整的权重文件。这样是能成功导出模型的,我加载分布式权重推断一次,和新的完整权重推断一次,两边的logits值是相等的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐