Alfa-Code / scripts /train_hf.py
mrsandip's picture
Train HF: use_cpu flag + grad fixes
5792a99 verified
Raw History Blame Contribute Delete
2.6 kB
"""HF Jobs compatible tiny-train: reads /data, writes /data/outputs + Hub."""
import argparse, json, os
os.environ.setdefault("PYTORCH_CUDA_ALLOC_CONF", "expandable_segments:True")
from pathlib import Path
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--data", default=os.getenv("ALFA_DATA", "/data/processed/train.jsonl"))
ap.add_argument("--out", default=os.getenv("ALFA_OUT", "/data/outputs/tiny-50M"))
ap.add_argument("--epochs", type=int, default=1)
ap.add_argument("--cpu", action="store_true", help="force CPU (no_cuda)")
args = ap.parse_args()
import torch
from transformers import LlamaConfig, LlamaForCausalLM, Trainer, TrainingArguments
from torch.utils.data import Dataset
class JsonlDS(Dataset):
def __init__(self, path, tok_len=256):
rows = [json.loads(l) for l in open(path, encoding="utf-8")]
self.rows, self.tok_len = rows, tok_len
def __len__(self): return len(self.rows)
def __getitem__(self, i):
r = self.rows[i]
s = (r.get("prompt", "") + "\n" + r.get("answer", ""))[:2000]
ids = [min(ord(c), 30000) for c in s][:self.tok_len]
ids += [0] * (self.tok_len - len(ids))
return {"input_ids": torch.tensor(ids, dtype=torch.long),
"labels": torch.tensor(ids, dtype=torch.long)}
print(f"data: {args.data} exists={Path(args.data).exists()}")
cfg = LlamaConfig(hidden_size=512, num_hidden_layers=8, num_attention_heads=8,
num_key_value_heads=4, intermediate_size=1376,
vocab_size=32000, max_position_embeddings=2048)
model = LlamaForCausalLM(cfg)
ds = JsonlDS(args.data)
use_cuda = torch.cuda.is_available() and not args.cpu
targs = TrainingArguments(output_dir=args.out, per_device_train_batch_size=1,
gradient_accumulation_steps=4,
num_train_epochs=args.epochs, logging_steps=2,
save_steps=50, save_total_limit=1,
fp16=use_cuda, use_cpu=args.cpu, report_to="none",
gradient_checkpointing=True,
gradient_checkpointing_kwargs={"use_reentrant": False},
dataloader_num_workers=0, dataloader_pin_memory=False,
max_grad_norm=0.0)
Trainer(model=model, args=targs, train_dataset=ds).train()
model.save_pretrained(args.out)
print(f"saved -> {args.out}")
if __name__ == "__main__":
main()