Upload train.py with huggingface_hub
Browse files
train.py
CHANGED
|
@@ -61,7 +61,7 @@ def estimate_loss(model, data, args, device):
|
|
| 61 |
return sum(losses) / len(losses)
|
| 62 |
|
| 63 |
|
| 64 |
-
def main():
|
| 65 |
parser = argparse.ArgumentParser(description="Latih model Indigo dari scratch")
|
| 66 |
parser.add_argument("--data", nargs="+", default=["data/sample.txt"], help="path file/folder teks untuk training")
|
| 67 |
parser.add_argument("--out", default="out", help="folder output checkpoint")
|
|
@@ -83,7 +83,7 @@ def main():
|
|
| 83 |
parser.add_argument("--tokenizer", default="char", choices=["char", "bpe"])
|
| 84 |
parser.add_argument("--vocab-size", type=int, default=512, help="ukuran vocab untuk tokenizer bpe")
|
| 85 |
parser.add_argument("--val-fraction", type=float, default=0.1, help="proporsi file untuk validasi")
|
| 86 |
-
args = parser.parse_args()
|
| 87 |
|
| 88 |
torch.manual_seed(args.seed)
|
| 89 |
if args.device == "auto":
|
|
@@ -111,6 +111,7 @@ def main():
|
|
| 111 |
start_step = 0
|
| 112 |
init_meta = None
|
| 113 |
config = None
|
|
|
|
| 114 |
if args.init_from:
|
| 115 |
init_state, init_meta, init_opt = load_init(args.init_from)
|
| 116 |
config = GPTConfig(**init_meta["config"])
|
|
@@ -125,9 +126,10 @@ def main():
|
|
| 125 |
tokenizer = BPETokenizer.train(all_text, args.vocab_size)
|
| 126 |
tinfo = tokenizer.state()
|
| 127 |
n_chars = len(all_text.encode("utf-8"))
|
|
|
|
| 128 |
print(
|
| 129 |
f"tokenizer=bpe | vocab={tokenizer.vocab_size} | "
|
| 130 |
-
f"kompresi {n_chars:,} karakter -> rasio {
|
| 131 |
)
|
| 132 |
else:
|
| 133 |
tokenizer = CharTokenizer.from_text(all_text)
|
|
@@ -232,6 +234,35 @@ def main():
|
|
| 232 |
torch.save(optimizer.state_dict(), os.path.join(args.out, "indigo_optimizer.pt"))
|
| 233 |
print(f"model tersimpan di {final_path} (+_meta.json, indigo_optimizer.pt)")
|
| 234 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
|
| 236 |
if __name__ == "__main__":
|
| 237 |
main()
|
|
|
|
| 61 |
return sum(losses) / len(losses)
|
| 62 |
|
| 63 |
|
| 64 |
+
def main(argv=None):
|
| 65 |
parser = argparse.ArgumentParser(description="Latih model Indigo dari scratch")
|
| 66 |
parser.add_argument("--data", nargs="+", default=["data/sample.txt"], help="path file/folder teks untuk training")
|
| 67 |
parser.add_argument("--out", default="out", help="folder output checkpoint")
|
|
|
|
| 83 |
parser.add_argument("--tokenizer", default="char", choices=["char", "bpe"])
|
| 84 |
parser.add_argument("--vocab-size", type=int, default=512, help="ukuran vocab untuk tokenizer bpe")
|
| 85 |
parser.add_argument("--val-fraction", type=float, default=0.1, help="proporsi file untuk validasi")
|
| 86 |
+
args = parser.parse_args(argv)
|
| 87 |
|
| 88 |
torch.manual_seed(args.seed)
|
| 89 |
if args.device == "auto":
|
|
|
|
| 111 |
start_step = 0
|
| 112 |
init_meta = None
|
| 113 |
config = None
|
| 114 |
+
comp_ratio = 1.0
|
| 115 |
if args.init_from:
|
| 116 |
init_state, init_meta, init_opt = load_init(args.init_from)
|
| 117 |
config = GPTConfig(**init_meta["config"])
|
|
|
|
| 126 |
tokenizer = BPETokenizer.train(all_text, args.vocab_size)
|
| 127 |
tinfo = tokenizer.state()
|
| 128 |
n_chars = len(all_text.encode("utf-8"))
|
| 129 |
+
comp_ratio = n_chars / max(1, len(tokenizer.encode(all_text)))
|
| 130 |
print(
|
| 131 |
f"tokenizer=bpe | vocab={tokenizer.vocab_size} | "
|
| 132 |
+
f"kompresi {n_chars:,} karakter -> rasio {comp_ratio:.2f}x"
|
| 133 |
)
|
| 134 |
else:
|
| 135 |
tokenizer = CharTokenizer.from_text(all_text)
|
|
|
|
| 234 |
torch.save(optimizer.state_dict(), os.path.join(args.out, "indigo_optimizer.pt"))
|
| 235 |
print(f"model tersimpan di {final_path} (+_meta.json, indigo_optimizer.pt)")
|
| 236 |
|
| 237 |
+
stats = {
|
| 238 |
+
"out": args.out,
|
| 239 |
+
"device": device,
|
| 240 |
+
"backend": "pytorch",
|
| 241 |
+
"tokenizer": tinfo.get("type", "char"),
|
| 242 |
+
"vocab_size": tokenizer.vocab_size,
|
| 243 |
+
"compression_ratio": round(comp_ratio, 4),
|
| 244 |
+
"tokens_train": len(train_data),
|
| 245 |
+
"tokens_val": len(val_data),
|
| 246 |
+
"files_train": max(0, len(files) - n_val),
|
| 247 |
+
"files_val": n_val,
|
| 248 |
+
"steps_trained": args.steps,
|
| 249 |
+
"total_steps": total_steps,
|
| 250 |
+
"best_val": best_val if best_val != float("inf") else None,
|
| 251 |
+
"last_val": last_val,
|
| 252 |
+
"nats_per_char_best": (
|
| 253 |
+
round(best_val / comp_ratio, 4) if best_val != float("inf") and comp_ratio else None
|
| 254 |
+
),
|
| 255 |
+
"params_million": round(model.num_params() / 1e6, 4),
|
| 256 |
+
"config": config.__dict__,
|
| 257 |
+
"args": {k: v for k, v in vars(args).items() if k != "data"},
|
| 258 |
+
"elapsed_sec": round(time.time() - t0, 1),
|
| 259 |
+
}
|
| 260 |
+
print(
|
| 261 |
+
f"ringkasan: best_val={stats['best_val']} | "
|
| 262 |
+
f"nats/karakter={stats['nats_per_char_best']} | params={stats['params_million']}M"
|
| 263 |
+
)
|
| 264 |
+
return stats
|
| 265 |
+
|
| 266 |
|
| 267 |
if __name__ == "__main__":
|
| 268 |
main()
|