MOSS icon indicating copy to clipboard operation
MOSS copied to clipboard

采用微调代码训练后得到的pytorch_model.bin达到了62g,请问有什么办法拆分成多个文件并且满足推理代码的调用格式?

Open KUANWB opened this issue 1 year ago • 4 comments

KUANWB avatar Apr 27 '23 10:04 KUANWB

请问gpt说的对吗 将一个较大的 PyTorch 模型文件拆分成多个文件是可行的,可以将模型权重拆分为多个部分,并使用多个文件进行存储。在推理代码中,需要加载所有的模型文件,并将它们合并为一个完整的模型,以进行推理。

以下是一个 Python 代码示例,演示如何将一个 PyTorch 模型文件拆分成多个文件,并在推理代码中加载这些文件:

import torch
import os

def save_model_to_multiple_files(model, output_dir, chunk_size=1024*1024*1024):
    # 将模型权重拆分为多个部分,并保存到多个文件中
    os.makedirs(output_dir, exist_ok=True)
    state_dict = model.state_dict()
    num_chunks = (sum(p.numel() for p in state_dict.values()) - 1) // chunk_size + 1
    chunk_idx = 1
    for name, tensor in state_dict.items():
        tensor = tensor.cpu()
        numel = tensor.numel()
        offset = 0
        while offset < numel:
            chunk_file = os.path.join(output_dir, f'{name}.{chunk_idx:04d}.pt')
            chunk_tensor = tensor.view(-1)[offset:offset+chunk_size].view_as(tensor)
            torch.save(chunk_tensor, chunk_file)
            offset += chunk_size
            chunk_idx += 1

def load_model_from_multiple_files(model_class, input_dir):
    # 从多个文件中加载模型权重,并合并为一个完整的模型
    state_dict = {}
    for file_name in os.listdir(input_dir):
        if file_name.endswith('.pt'):
            file_path = os.path.join(input_dir, file_name)
            chunk_state_dict = torch.load(file_path, map_location='cpu')
            state_dict.update(chunk_state_dict)
    model = model_class()
    model.load_state_dict(state_dict)
    return model

在上面的示例中,save_model_to_multiple_files 函数接受三个参数:model 表示要保存的 PyTorch 模型,output_dir 表示拆分后的文件保存路径,chunk_size 表示每个文件的最大大小(默认为 1GB)。

在函数内部,我们先计算模型权重拆分为多少个部分(根据 chunk_size 计算)。然后,对于模型中的每个权重张量,将其分成多个部分,并保存到多个文件中。拆分的文件名使用了 <name>.<chunk_idx>.pt 的格式,其中 <name> 表示权重张量的名称,<chunk_idx> 表示拆分后的文件序号。

load_model_from_multiple_files 函数接受两个参数:model_class 表示要加载的 PyTorch 模型类,input_dir 表示拆分后的文件所在的路径。该函数从指定目录中加载多个文件,并将它们合并为一个完整的 PyTorch 模型。

使用上述代码,我们可以将一个较大的 PyTorch 模型拆分成多个文件,并在推理代码中使用 load_model_from_multiple_files 函数加载

starplatinum3 avatar May 04 '23 03:05 starplatinum3

这样做是不是还需要在一张卡上推理。。。现在是想把这个62g的模型加载到到多张卡上进行推理,因为现在单张卡显存只有40g

KUANWB avatar May 05 '23 03:05 KUANWB

No description provided.

为啥我用官方程序生成的是 .pt 文件?

我的训练文件使用https://github.com/OpenLMLab/MOSS/issues/282 的方法生成

没有使用官方的2.5GB的数据

lhtpluto avatar May 30 '23 07:05 lhtpluto

同问,UU有答案了吗,想把model拆分多个

zmtttt avatar Jun 05 '24 06:06 zmtttt