export_state_dict_checkpoint.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import os
  2. import json
  3. import torch
  4. from peft import PeftModel, LoraConfig
  5. from transformers import LLaMATokenizer, LLaMAForCausalLM
  6. tokenizer = LLaMATokenizer.from_pretrained("decapoda-research/llama-7b-hf")
  7. base_model = LLaMAForCausalLM.from_pretrained(
  8. "decapoda-research/llama-7b-hf",
  9. load_in_8bit=False,
  10. torch_dtype=torch.float16,
  11. device_map={"": "cpu"},
  12. )
  13. lora_model = PeftModel.from_pretrained(
  14. base_model,
  15. "tloen/alpaca-lora-7b",
  16. device_map={"": "cpu"},
  17. torch_dtype=torch.float16,
  18. )
  19. # merge weights
  20. for layer in lora_model.base_model.model.model.layers:
  21. layer.self_attn.q_proj.merge_weights = True
  22. layer.self_attn.v_proj.merge_weights = True
  23. lora_model.train(False)
  24. lora_model_sd = lora_model.state_dict()
  25. params = {
  26. "dim": 4096,
  27. "multiple_of": 256,
  28. "n_heads": 32,
  29. "n_layers": 32,
  30. "norm_eps": 1e-06,
  31. "vocab_size": -1,
  32. }
  33. n_layers = params["n_layers"]
  34. n_heads = params["n_heads"]
  35. dim = params["dim"]
  36. dims_per_head = dim // n_heads
  37. base = 10000.0
  38. inv_freq = 1.0 / (base ** (torch.arange(0, dims_per_head, 2).float() / dims_per_head))
  39. def permute(w):
  40. return (
  41. w.view(n_heads, dim // n_heads // 2, 2, dim).transpose(1, 2).reshape(dim, dim)
  42. )
  43. def unpermute(w):
  44. return (
  45. w.view(n_heads, 2, dim // n_heads // 2, dim).transpose(1, 2).reshape(dim, dim)
  46. )
  47. def translate_state_dict_key(k):
  48. k = k.replace("base_model.model.", "")
  49. if k == "model.embed_tokens.weight":
  50. return "tok_embeddings.weight"
  51. elif k == "model.norm.weight":
  52. return "norm.weight"
  53. elif k == "lm_head.weight":
  54. return "output.weight"
  55. elif k.startswith("model.layers."):
  56. layer = k.split(".")[2]
  57. if k.endswith(".self_attn.q_proj.weight"):
  58. return f"layers.{layer}.attention.wq.weight"
  59. elif k.endswith(".self_attn.k_proj.weight"):
  60. return f"layers.{layer}.attention.wk.weight"
  61. elif k.endswith(".self_attn.v_proj.weight"):
  62. return f"layers.{layer}.attention.wv.weight"
  63. elif k.endswith(".self_attn.o_proj.weight"):
  64. return f"layers.{layer}.attention.wo.weight"
  65. elif k.endswith(".mlp.gate_proj.weight"):
  66. return f"layers.{layer}.feed_forward.w1.weight"
  67. elif k.endswith(".mlp.down_proj.weight"):
  68. return f"layers.{layer}.feed_forward.w2.weight"
  69. elif k.endswith(".mlp.up_proj.weight"):
  70. return f"layers.{layer}.feed_forward.w3.weight"
  71. elif k.endswith(".input_layernorm.weight"):
  72. return f"layers.{layer}.attention_norm.weight"
  73. elif k.endswith(".post_attention_layernorm.weight"):
  74. return f"layers.{layer}.ffn_norm.weight"
  75. elif k.endswith("rotary_emb.inv_freq") or "lora" in k:
  76. return None
  77. else:
  78. print(layer, k)
  79. raise NotImplementedError
  80. else:
  81. print(k)
  82. raise NotImplementedError
  83. new_state_dict = {}
  84. for k, v in lora_model_sd.items():
  85. new_k = translate_state_dict_key(k)
  86. if new_k is not None:
  87. if "wq" in new_k or "wk" in new_k:
  88. new_state_dict[new_k] = unpermute(v)
  89. else:
  90. new_state_dict[new_k] = v
  91. os.makedirs("./ckpt", exist_ok=True)
  92. torch.save(new_state_dict, "./ckpt/consolidated.00.pth")
  93. with open("./ckpt/params.json", "w") as f:
  94. json.dump(params, f)