Put eval.py
Browse files
eval.py
CHANGED
|
@@ -65,12 +65,13 @@ def evaluate(model, ds, tokenizer, batch, device):
|
|
| 65 |
targets = labs[:, 1:]
|
| 66 |
mask = targets != -100
|
| 67 |
preds = logits.argmax(-1)
|
| 68 |
-
corr = (
|
| 69 |
n = mask.sum().item()
|
| 70 |
tok_sum += n
|
| 71 |
corr_sum += corr.sum().item()
|
| 72 |
if n > 0:
|
| 73 |
nll_sum += out.loss.item() * n
|
|
|
|
| 74 |
loss = nll_sum / max(tok_sum, 1)
|
| 75 |
acc = corr_sum / max(tok_sum, 1)
|
| 76 |
return loss, acc
|
|
@@ -79,11 +80,11 @@ def evaluate(model, ds, tokenizer, batch, device):
|
|
| 79 |
def main():
|
| 80 |
ap = argparse.ArgumentParser()
|
| 81 |
ap.add_argument("--max_length", type=int, default=8192)
|
| 82 |
-
ap.add_argument("--batch", type=int, default=
|
| 83 |
args = ap.parse_args()
|
| 84 |
|
| 85 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 86 |
-
print("device:", device)
|
| 87 |
|
| 88 |
tokenizer = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
|
| 89 |
if tokenizer.pad_token is None:
|
|
@@ -95,7 +96,13 @@ def main():
|
|
| 95 |
eval_ds = eval_ds.map(
|
| 96 |
lambda r: tokenize_row(r, tokenizer, args.max_length), remove_columns=["text"]
|
| 97 |
)
|
| 98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16
|
| 101 |
|
|
@@ -103,6 +110,8 @@ def main():
|
|
| 103 |
base = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, torch_dtype=dtype).to(device)
|
| 104 |
base_loss, base_acc = evaluate(base, eval_ds, tokenizer, args.batch, device)
|
| 105 |
print(f"base eval_loss={base_loss:.4f} eval_token_acc={base_acc:.4f}")
|
|
|
|
|
|
|
| 106 |
|
| 107 |
print("\n=== Finetuned (base + LoRA adapter) ===")
|
| 108 |
ft = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, torch_dtype=dtype).to(device)
|
|
|
|
| 65 |
targets = labs[:, 1:]
|
| 66 |
mask = targets != -100
|
| 67 |
preds = logits.argmax(-1)
|
| 68 |
+
corr = (preds == targets) & mask
|
| 69 |
n = mask.sum().item()
|
| 70 |
tok_sum += n
|
| 71 |
corr_sum += corr.sum().item()
|
| 72 |
if n > 0:
|
| 73 |
nll_sum += out.loss.item() * n
|
| 74 |
+
del out, logits
|
| 75 |
loss = nll_sum / max(tok_sum, 1)
|
| 76 |
acc = corr_sum / max(tok_sum, 1)
|
| 77 |
return loss, acc
|
|
|
|
| 80 |
def main():
|
| 81 |
ap = argparse.ArgumentParser()
|
| 82 |
ap.add_argument("--max_length", type=int, default=8192)
|
| 83 |
+
ap.add_argument("--batch", type=int, default=1)
|
| 84 |
args = ap.parse_args()
|
| 85 |
|
| 86 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 87 |
+
print("device:", device, "| batch:", args.batch)
|
| 88 |
|
| 89 |
tokenizer = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
|
| 90 |
if tokenizer.pad_token is None:
|
|
|
|
| 96 |
eval_ds = eval_ds.map(
|
| 97 |
lambda r: tokenize_row(r, tokenizer, args.max_length), remove_columns=["text"]
|
| 98 |
)
|
| 99 |
+
lens = sorted(len(r["input_ids"]) for r in eval_ds)
|
| 100 |
+
print(
|
| 101 |
+
"held-out rows:", len(eval_ds),
|
| 102 |
+
"| len p50=%d p95=%d max=%d" % (
|
| 103 |
+
lens[len(lens) // 2], lens[int(len(lens) * 0.95)], lens[-1],
|
| 104 |
+
),
|
| 105 |
+
)
|
| 106 |
|
| 107 |
dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16
|
| 108 |
|
|
|
|
| 110 |
base = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, torch_dtype=dtype).to(device)
|
| 111 |
base_loss, base_acc = evaluate(base, eval_ds, tokenizer, args.batch, device)
|
| 112 |
print(f"base eval_loss={base_loss:.4f} eval_token_acc={base_acc:.4f}")
|
| 113 |
+
del base
|
| 114 |
+
torch.cuda.empty_cache()
|
| 115 |
|
| 116 |
print("\n=== Finetuned (base + LoRA adapter) ===")
|
| 117 |
ft = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, torch_dtype=dtype).to(device)
|