root commited on
Commit
ae93403
·
1 Parent(s): 7a4ca68

Add safe tensor converting code

Browse files
Files changed (1) hide show
  1. handle_safetensors.py +66 -0
handle_safetensors.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from safetensors.torch import save_file
2
+ from safetensors.torch import safe_open
3
+ import os
4
+ import torch
5
+ import argparse
6
+ from transformers import AutoModelForCausalLM
7
+
8
+ def save_model_at_once(model, save_dir):
9
+ import pdb
10
+ pdb.set_trace()
11
+ tensors = {k:v for k, v in model.state_dict().items()}
12
+ path = os.path.join(save_dir, "model.safetensors")
13
+ save_file(tensors, path)
14
+
15
+ def save_model_in_distributed_safetensor(model, save_dir, n_file=2):
16
+ total_params = [torch.numel(model.state_dict()[k]) for k in model.state_dict()]
17
+ params_per_gpu = float(sum(total_params) / n_file)
18
+ params = [0]
19
+ tensors = {}
20
+ for i, (k, v) in enumerate(model.state_dict().items()):
21
+ cur_params = torch.numel(model.state_dict()[k])
22
+ params[-1] += cur_params
23
+ tensors.update({k:v})
24
+ if params[-1] > params_per_gpu or i == len(model.state_dict())-1:
25
+ name = f"model{len(params)-1}.safetensors"
26
+ path = os.path.join(save_dir, name)
27
+ save_file(tensors, path)
28
+ params.append(0)
29
+ del tensors
30
+ tensors = {}
31
+
32
+ def load_model_test(load_path, model_name="model.safetensors"):
33
+ tensors = {}
34
+ path = os.path.join(load_path, model_name)
35
+ with safe_open(path, framework="pt", device=0) as f:
36
+ for k in f.keys():
37
+ tensors[k] = f.get_tensor(k)
38
+ print(f.keys())
39
+ print("Success to load.")
40
+
41
+ if __name__ == "__main__":
42
+ parser = argparse.ArgumentParser()
43
+ parser.add_argument("--model_path", type=str, default=None, help="huggingface .bin file dir")
44
+ parser.add_argument("--save_dir", type=str, default=None, help="path to save")
45
+ parser.add_argument("--n_file", type=int, default=1, help="Whether to split weight params when saving safetensors")
46
+ parser.add_argument("--check_load", action="store_true")
47
+ args = parser.parse_args()
48
+
49
+ model = AutoModelForCausalLM.from_pretrained(args.model_path)
50
+ print("Model loaded")
51
+
52
+ if not os.path.exists(args.save_dir):
53
+ from pathlib import Path
54
+ Path(args.save_dir).mkdir(parents=True, exist_ok=True)
55
+
56
+ load_path = args.save_dir
57
+ if args.n_file == 1:
58
+ save_model_at_once(model, args.save_dir)
59
+ if args.check_load:
60
+ load_model_test(load_path)
61
+ else:
62
+ assert args.n_file >=2
63
+ save_model_in_distributed_safetensor(model, args.save_dir, n_file=args.n_file)
64
+ if args.check_load:
65
+ load_model_test(load_path, model_name="model0.safetensors")
66
+ load_model_test(load_path, model_name=f"model{args.n_file-1}.safetensors")