Mentors4EDU's picture
Publish training pipeline under training/; update repository notes
db3982a verified
Raw History Blame Contribute Delete
2.44 kB
from __future__ import annotations
import argparse
import logging
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from transformers import AutoTokenizer
from riemann.growth_ladder import get_stage, next_stage
from riemann.growth import load_checkpoint_and_grow
from riemann.paths import CHECKPOINT_ROOT
logger = logging.getLogger("riemann.grow_and_continue")
TOKENIZER_NAME = "gpt2"
def main() -> None:
logging.basicConfig(
level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s"
)
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
"--from-stage", required=True, help="the stage you just finished training"
)
parser.add_argument(
"--to-stage",
default=None,
help="target stage name (default: the next one in the ladder)",
)
parser.add_argument("--checkpoint-root", default=str(CHECKPOINT_ROOT))
args = parser.parse_args()
from_stage = get_stage(args.from_stage)
to_stage = (
get_stage(args.to_stage) if args.to_stage else next_stage(from_stage.name)
)
from_dir = Path(args.checkpoint_root) / from_stage.name
to_dir = Path(args.checkpoint_root) / to_stage.name
if not (from_dir / "config.json").exists():
raise FileNotFoundError(
f"No checkpoint found at {from_dir} -- train this stage first"
)
logger.info("Growing %s -> %s", from_stage.name, to_stage.name)
grown_model = load_checkpoint_and_grow(str(from_dir), to_stage)
to_dir.mkdir(parents=True, exist_ok=True)
grown_model.save_pretrained(str(to_dir))
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_NAME)
tokenizer.save_pretrained(str(to_dir))
n_params = sum((p.numel() for p in grown_model.parameters()))
logger.info(
"Saved grown checkpoint to %s (%d params, ~%.2fB)",
to_dir,
n_params,
n_params / 1000000000.0,
)
if not to_stage.feasible_on_this_machine:
logger.warning(
"%s is marked not feasible on this machine; expect this to be slow or run out of memory",
to_stage.name,
)
logger.info("Next: python scripts/pretrain.py --stage %s --resume", to_stage.name)
if __name__ == "__main__":
main()