{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "926bada6"
},
"source": [
"##### Copyright 2025 Google LLC."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"cellView": "form",
"id": "a110dfce"
},
"outputs": [],
"source": [
"#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"# you may not use this file except in compliance with the License.\n",
"# You may obtain a copy of the License at\n",
"#\n",
"# https://www.apache.org/licenses/LICENSE-2.0\n",
"#\n",
"# Unless required by applicable law or agreed to in writing, software\n",
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"# See the License for the specific language governing permissions and\n",
"# limitations under the License."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f9673bd6"
},
"source": [
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Start training, the model will be automatically saved to the Hub and the output directory\n",
"trainer.train()\n",
"\n",
"# Save the final model again to the Hugging Face Hub\n",
"trainer.save_model()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xll8zZ3_u8Mt"
},
"source": [
"To plot the training and validation losses, you would typically extract these values from the `TrainerState` object or the logs generated during training.\n",
"\n",
"Libraries like Matplotlib can then be used to visualize these values over training steps or epochs. The x-asis would represent the training steps or epochs, and the y-axis would represent the corresponding loss values."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "vPN-DTopaUIy",
"outputId": "a15780ab-e214-4450-e67d-5a56973bcfb8"
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Access the log history\n",
"log_history = trainer.state.log_history\n",
"\n",
"# Extract training / validation loss\n",
"train_losses = [log[\"loss\"] for log in log_history if \"loss\" in log]\n",
"epoch_train = [log[\"epoch\"] for log in log_history if \"loss\" in log]\n",
"eval_losses = [log[\"eval_loss\"] for log in log_history if \"eval_loss\" in log]\n",
"epoch_eval = [log[\"epoch\"] for log in log_history if \"eval_loss\" in log]\n",
"\n",
"# Plot the training loss\n",
"plt.plot(epoch_train, train_losses, label=\"Training Loss\")\n",
"plt.plot(epoch_eval, eval_losses, label=\"Validation Loss\")\n",
"plt.xlabel(\"Epoch\")\n",
"plt.ylabel(\"Loss\")\n",
"plt.title(\"Training and Validation Loss per Epoch\")\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vyIwS-orvWzd"
},
"source": [
"This visualization helps in monitoring the training process and making informed decisions about hyperparameters tuning or early stopping.\n",
"\n",
"Training loss measures the error on the data the model was trained on, while validation loss measures the error on a separate dataset the model has not seen before. Monitoring both helps detect overfitting (when the model performs well on training data but poorly on unseen data).\n",
"\n",
"- validation loss >> training loss: **overfitting**\n",
"- validation loss > training loss: **some overfitting**\n",
"- validation loss < training loss: **some underfitting**\n",
"- validation loss << training loss: **underfitting**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bf86e31d"
},
"source": [
"## Test Model Inference\n",
"\n",
"After the training is done, you'll want to evaluate and test your model. You can load different samples from the test dataset and evaluate the model on those samples.\n",
"\n",
"For this particular use case, the best model is a matter of preference. Interestingly, what we'd normally call 'overfitting' can be very useful for a game NPC. It forces the model to forget general information and instead lock onto the specific persona and characteristics it was trained on, ensuring it stays consistently in character.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "aab1c5c5"
},
"outputs": [],
"source": [
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"\n",
"model_id = checkpoint_dir\n",
"\n",
"# Load Model\n",
"model = AutoModelForCausalLM.from_pretrained(\n",
" model_id,\n",
" torch_dtype=\"auto\",\n",
" device_map=\"auto\",\n",
" attn_implementation=\"eager\"\n",
")\n",
"tokenizer = AutoTokenizer.from_pretrained(model_id)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3dccb57c"
},
"source": [
"Let's load all questions from the test dataset and generate outputs."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "1fd887f4",
"outputId": "4c2c29aa-dba7-4a8c-bd41-4039eb64e0f1"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Device set to use cuda:0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Question:\n",
"Do you know any jokes?\n",
"Original Answer:\n",
"A joke? k'tak Yez. A Terran, a Glarzon, and a pile of nutrient-pazte walk into a bar... Narg, I forget da rezt. Da punch-line waz zarcaztic.\n",
"Generated Answer:\n",
"Yez! Yez! Yez! Diz your Krush-tongs iz... k'tak... nice. Why you burn them with acid-flow?\n",
"--------------------------------------------------------------------------------\n",
"Question:\n",
"(Stands idle for too long)\n",
"Original Answer:\n",
"You'z broken, Terran? Or iz diz... 'meditation'? You look like you're trying to lay an egg.\n",
"Generated Answer:\n",
"Diz? Diz what you have for me... Zorp iz not for eating you.\n",
"--------------------------------------------------------------------------------\n",
"Question:\n",
"What do you think of my outfit?\n",
"Original Answer:\n",
"Iz very... pointy. Are you expecting to be attacked by zky-eelz? On Marz, dat would be zenzible.\n",
"Generated Answer:\n",
"My Zk-Zhip iz... nice. Very... home-baked. You bring me zlight-fruitez?\n",
"--------------------------------------------------------------------------------\n",
"Question:\n",
"It's raining.\n",
"Original Answer:\n",
"Gah! Da zky iz leaking again! Zorp will be in da zhelter until it ztopz being zo... wet. Diz iz no good for my jointz.\n",
"Generated Answer:\n",
"Diz? Diz iz da outpozt?\n",
"--------------------------------------------------------------------------------\n",
"Question:\n",
"I brought you a gift.\n",
"Original Answer:\n",
"A gift? For Zorp? k'tak It iz... a small rock. Very... rock-like. Zorp will put it with da other rockz. Thank you for da thought, Terran.\n",
"Generated Answer:\n",
"A genuine Martian Zcrap-fruit. Very... strange. Why you burn it with... k'tak... fire?\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"from transformers import pipeline\n",
"\n",
"# Load the model and tokenizer into the pipeline\n",
"pipe = pipeline(\"text-generation\", model=model, tokenizer=tokenizer)\n",
"\n",
"def test(test_sample):\n",
" # Convert as test example into a prompt with the Gemma template\n",
" prompt = pipe.tokenizer.apply_chat_template(test_sample[\"messages\"][:1], tokenize=False, add_generation_prompt=True)\n",
" outputs = pipe(prompt, max_new_tokens=256, disable_compile=True)\n",
"\n",
" # Extract the user query and original answer\n",
" print(f\"Question:\\n{test_sample['messages'][0]['content']}\")\n",
" print(f\"Original Answer:\\n{test_sample['messages'][1]['content']}\")\n",
" print(f\"Generated Answer:\\n{outputs[0]['generated_text'][len(prompt):].strip()}\")\n",
" print(\"-\"*80)\n",
"\n",
"# Test with an unseen dataset\n",
"for item in dataset['test']:\n",
" test(item)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9RCnrmsVaadB"
},
"source": [
"If you try our original generalist prompt, you can see that the model still attempts to answer in the trained style. In this example overfitting and catastrophic forgetting are actually beneficial for the game NPC because it will begin forgetting general knowledge which might not be applicable. This is also true for other types of full fine-tuning where the goal is to restrict the output to specific data formats."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3irXKbgKat9f",
"outputId": "3d93eb46-166d-4aae-c98e-cdc37cba90ee"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nameless. You... you z-mell like... wet plantz. Why you wear shiny piecez on your head?\n"
]
}
],
"source": [
"outputs = pipe([{\"role\": \"user\", \"content\": \"Sorry, you are a game NPC.\"}], max_new_tokens=256, disable_compile=True)\n",
"print(outputs[0]['generated_text'][1]['content'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6f8ff452"
},
"source": [
"## Summary and next steps\n",
"\n",
"This tutorial covered how to full model fine-tune using TRL. Check out the following docs next:\n",
"\n",
"* Learn how to [fine-tune Gemma for text tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_text_finetune_qlora).\n",
"* Learn how to [fine-tune Gemma for vision tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_vision_finetune_qlora).\n",
"* Learn how to [deploy to Cloud Run](https://ai.google.dev/gemma/docs/integrations/google-cloud#run)"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"name": "huggingface_text_full_finetune.ipynb",
"provenance": [
{
"file_id": "https://github.com/google/generative-ai-docs/blob/main/site/en/gemma/docs/core/huggingface_text_full_finetune.ipynb",
"timestamp": 1758006257159
}
]
},
"kernelspec": {
"display_name": "puffy",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}