MOSS
MOSS copied to clipboard
采用微调代码训练后得到的pytorch_model.bin达到了62g,请问有什么办法拆分成多个文件并且满足推理代码的调用格式?
请问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
函数加载
这样做是不是还需要在一张卡上推理。。。现在是想把这个62g的模型加载到到多张卡上进行推理,因为现在单张卡显存只有40g
No description provided.
为啥我用官方程序生成的是 .pt 文件?
我的训练文件使用https://github.com/OpenLMLab/MOSS/issues/282 的方法生成
没有使用官方的2.5GB的数据
同问,UU有答案了吗,想把model拆分多个