{ "cells": [ { "cell_type": "markdown", "id": "cell-0", "metadata": {}, "source": [ "# Fine-tune a BERT sentence classifier\n", "\n", "Install the checkout's `[notebooks]` extra and run `data.ipynb` first.\n", "The default is an offline CPU demonstration: a tiny randomly initialised\n", "BERT with a local vocabulary, trained for one epoch. It verifies the\n", "pipeline and does **not** reproduce SciBERT or its historical scores.\n", "\n", "Set `GREAT_AI_NOTEBOOK_FULL=1` before starting Jupyter to fine-tune\n", "`allenai/scibert_scivocab_uncased` instead. This downloads pretrained weights\n", "and takes substantially more memory and time; a GPU is recommended.\n", "Run the data and deployment notebooks in the same mode." ] }, { "cell_type": "markdown", "id": "2346798f", "metadata": {}, "source": [ "## Local setup\n", "\n", "Use Python 3.12 or 3.13 and install this checkout with `uv pip install --editable '.[notebooks]'`.\n", "See **Run notebooks locally** in the repository README for the kernel, execution order,\n", "and full-data options. Run related notebooks from the same working directory\n", "to share the default `.cache/` model store and `tracing_database.json` database.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "824837fa", "metadata": {}, "outputs": [], "source": [ "from docs.notebook_support import FULL_RUN" ] }, { "cell_type": "code", "execution_count": 2, "id": "cell-3", "metadata": {}, "outputs": [], "source": [ "# Dependencies are installed once with uv pip install --editable \".[notebooks]\"." ] }, { "cell_type": "markdown", "id": "cell-4", "metadata": {}, "source": [ "Load the dataset saved locally by `data.ipynb`." ] }, { "cell_type": "code", "execution_count": 3, "id": "cell-5", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mFetching cached versions of summary-train-dataset-small\u001b[0m\n", "\u001b[38;5;39mLatest version of summary-train-dataset-small is 0 (from versions: 0)\u001b[0m\n", "\u001b[38;5;39mFile summary-train-dataset-small-0 found in cache\u001b[0m\n" ] } ], "source": [ "from great_ai.large_file import LargeFileLocal\n", "import json\n", "\n", "with LargeFileLocal(\"summary-train-dataset-small\", encoding=\"utf-8\") as f:\n", " X, y = json.load(f)" ] }, { "cell_type": "markdown", "id": "cell-6", "metadata": {}, "source": [ "Finetune SciBERT, for more info about this step, check out [HuggingFace](https://huggingface.co/docs/transformers/training).\n", "If you're only here for `great-ai`, feel free to skip the next cell.\n", "\n", "We use an 80/20 training/validation split. Early stopping and checkpoint selection both use validation binary F1 for positive label `1`. There is no independent test split in this example. The split and training seed is fixed for future runs, and the selected checkpoint's evaluation and run metadata are saved under `models/`.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "cell-7", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "W1028 12:48:58.270000 53390 torch/distributed/elastic/multiprocessing/redirects.py:35] NOTE: Redirects are currently not supported in MacOs.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2c74823d6364447a96609229fbbc5512", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map: 0%| | 0/60 [00:00