Commit 9ebfb0be by huchi

add tools for converting model format (from pytorch to niutensor)

parent 4c5776f0
import argparse
from struct import pack
import torch
parser = argparse.ArgumentParser(description='Pack Pytorch model to NiuTensor')
parser.add_argument('-src', help='pytorch model', type=str, default='model.pt')
parser.add_argument('-tgt', help='niutensor model', type=str, default='model.bin')
args = parser.parse_args()
model = torch.load(args.src, map_location='cpu')
model = model['model']
def get_model_parameters(m):
'''
get flattend transformer model parameters
'''
p = []
w = None
for k in m:
if 'embed_tokens.weight' in k:
w = m[k]
elif m[k].numel() != 1:
# p.append(m[k])
if 'weight' in k:
# weights for qkv
if 'in_proj' in k:
dim = m[k].shape[0] // 3
p.append((m[k][:dim, :]).t())
p.append((m[k][dim:dim*2, :]).t())
p.append((m[k][dim*2:, :]).t())
else:
if 'norm' in k:
p.append(m[k])
else:
p.append(m[k].t())
else:
p.append(m[k])
# encoder embedding weight
p.append(w)
# decoder embedding weight
p.append(w)
# output weight
p.append(w)
return p
with torch.no_grad():
params = get_model_parameters(model)
params_number = pack("Q", len(params))
params_size = pack("Q" * len(params), *[p.numel() for p in params])
print('total params: ', len(params))
print('total params size: ', sum([p.numel() for p in params]))
with open(args.tgt+".name.txt", "w") as name_list:
for p in model:
name_list.write("{}\t{}\n".format(p, model[p].shape))
with open(args.tgt+".bin", 'wb') as tgt:
# part 1: number of parameters
# tgt.write(params_number)
# part 2: offsets of parameters
# tgt.write(params_size)
# part 3: values of parameters
for p in params:
values = pack("f" * p.numel(), *(p.contiguous().view(-1).cpu().tolist()))
tgt.write(values)
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论