šŸŽ“ Interactive Fine-Tuning Exercise

Learn Azure OpenAI SDK through hands-on practice - Step by step notebook simulation

Progress 0 / 6 steps completed
Step 1: Environment Setup & Introduction

šŸ“‹ Learning Objectives

  • Understand the Azure OpenAI SDK for fine-tuning
  • Learn the complete fine-tuning workflow
  • Practice with training data and configurations
  • Monitor and evaluate fine-tuning jobs

Knowledge Check

Before we start, what is the primary purpose of fine-tuning an AI model?

A) To make the model run faster during inference
B) To reduce the model's memory requirements
C) To adapt the model's behavior for specific tasks or domains
D) To increase the model's parameter count
Correct! Fine-tuning adapts a pre-trained model to perform better on specific tasks or domains by training it on domain-specific data. This helps the model understand your particular use case better while maintaining its general capabilities.
āœ… Great! Now you understand the purpose of fine-tuning. Let's set up our environment.
Step 2: Check Environment Variables

First, let's verify that our Azure OpenAI credentials are properly configured:

Knowledge Check

Which environment variables are essential for connecting to Azure OpenAI services?

A) OPENAI_API_KEY and OPENAI_ORG only
B) AZURE_OPENAI_API_KEY and AZURE_OPENAI_ENDPOINT
C) AZURE_SUBSCRIPTION_ID and AZURE_TENANT_ID
D) API_VERSION and MODEL_NAME only
Correct! Azure OpenAI requires AZURE_OPENAI_API_KEY for authentication and AZURE_OPENAI_ENDPOINT to specify which Azure OpenAI resource to connect to. These are different from standard OpenAI API credentials.
[1]: Python
Complete the knowledge check above to unlock this code
import os openai_key = os.getenv("AZURE_OPENAI_API_KEY") openai_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") model_name = "gpt-4.1" api_version = os.getenv("AZURE_OPENAI_API_VERSION", "2025-02-01-preview") if not openai_key or not openai_endpoint: print("Error: Missing AZURE_OPENAI_KEY or AZURE_OPENAI_ENDPOINT environment variable.") print("Using Model:", model_name) print("Using API Version:", api_version)
Using Model: gpt-4.1 Using API Version: 2025-02-01-preview āœ… Environment variables configured successfully!
Step 3: Training Data Preparation

Knowledge Check

What format should training data be in for Azure OpenAI fine-tuning?

A) CSV with columns for input and output
B) JSONL (JSON Lines) with message arrays
C) Plain text files with examples
D) XML with structured conversation elements
Correct! Azure OpenAI fine-tuning requires JSONL format where each line contains a JSON object with a "messages" array. Each message has "role" (system/user/assistant) and "content" properties.
[2]: Python
Answer the question above to unlock this code
import json print("šŸ“‚ Loading and validating training data...") # Define data files training_file = "data/basic_sft_training.jsonl" validation_file = "data/basic_sft_validation.jsonl" # Simulate loading training data training_dataset = [ {"messages": [ {"role": "system", "content": "You are a helpful assistant for Zava Corp."}, {"role": "user", "content": "What are your business hours?"}, {"role": "assistant", "content": "Zava Corp is open Monday-Friday 9AM-6PM EST."} ]}, {"messages": [ {"role": "user", "content": "How can I contact support?"}, {"role": "assistant", "content": "You can reach Zava support at support@zava.com or call 1-800-ZAVA-HELP."} ]} ] print(f"āœ… Training set loaded: {len(training_dataset)} examples") print(f"\nšŸ“‹ First training example:") for i, message in enumerate(training_dataset[0]["messages"]): role_emoji = {"system": "šŸ¤–", "user": "šŸ‘¤", "assistant": "šŸ”®"} emoji = role_emoji.get(message["role"], "šŸ’¬") print(f" {emoji} {message['role'].upper()}: {message['content']}") print(f"\nšŸ“Š Data Summary:") print(f" Training examples: {len(training_dataset)}") print(f" Validation examples: 25") print(f" Total examples: {len(training_dataset) + 25}")
šŸ“‚ Loading and validating training data... āœ… Training set loaded: 2 examples šŸ“‹ First training example: šŸ¤– SYSTEM: You are a helpful assistant for Zava Corp. šŸ‘¤ USER: What are your business hours? šŸ”® ASSISTANT: Zava Corp is open Monday-Friday 9AM-6PM EST. šŸ“Š Data Summary: Training examples: 2 Validation examples: 25 Total examples: 27
Step 4: Upload Training Data to Azure

Knowledge Check

Which Azure OpenAI SDK method is used to upload training files?

A) client.files.create()
B) client.files.create() with purpose="fine-tune"
C) client.training_data.upload()
D) client.fine_tuning.upload_file()
Correct! The client.files.create() method with purpose="fine-tune" is used to upload training data files to Azure OpenAI for fine-tuning.
[3]: Python
Answer the question above to unlock this code
from openai import AzureOpenAI # Initialize Azure OpenAI client client = AzureOpenAI( api_key=openai_key, api_version=api_version, azure_endpoint=openai_endpoint ) print("šŸ“¤ Uploading training data to Azure OpenAI...") # Upload training file with open(training_file, "rb") as f: training_response = client.files.create( file=f, purpose="fine-tune" ) training_file_id = training_response.id print(f"āœ… Training file uploaded successfully!") print(f" File ID: {training_file_id}") print(f" Status: {training_response.status}") print(f" Size: {training_response.bytes} bytes") # Upload validation file with open(validation_file, "rb") as f: validation_response = client.files.create( file=f, purpose="fine-tune" ) validation_file_id = validation_response.id print(f"\nāœ… Validation file uploaded successfully!") print(f" File ID: {validation_file_id}") print(f" Status: {validation_response.status}")
šŸ“¤ Uploading training data to Azure OpenAI... āœ… Training file uploaded successfully! File ID: file-abc123training456 Status: processed Size: 2048 bytes āœ… Validation file uploaded successfully! File ID: file-def789validation012 Status: processed
Step 5: Create Fine-tuning Job

Knowledge Check

What are the key parameters needed to create a fine-tuning job?

A) model, training_file only
B) model, training_file, validation_file (optional), hyperparameters
C) training_file, epochs, learning_rate only
D) model, dataset_size, training_time
Correct! Fine-tuning jobs require the base model, training file ID, optionally a validation file, and can include hyperparameters like learning rate and epochs for optimization.
[4]: Python
Answer the question above to unlock this code
print("šŸš€ Creating fine-tuning job...") # Create fine-tuning job job_response = client.fine_tuning.jobs.create( model="gpt-4-0613", # Base model to fine-tune training_file=training_file_id, validation_file=validation_file_id, hyperparameters={ "n_epochs": 3, "learning_rate": 0.0001, "batch_size": 1 }, suffix="zava-support-v1" # Will be appended to model name ) job_id = job_response.id print(f"āœ… Fine-tuning job created successfully!") print(f" Job ID: {job_id}") print(f" Status: {job_response.status}") print(f" Model: {job_response.model}") print(f" Created: {job_response.created_at}") print(f"\nšŸ“Š Hyperparameters:") print(f" Epochs: {job_response.hyperparameters.n_epochs}") print(f" Learning Rate: {job_response.hyperparameters.learning_rate}") print(f" Batch Size: {job_response.hyperparameters.batch_size}") print(f"\nšŸ”— Track your job at: https://oai.azure.com/portal")
šŸš€ Creating fine-tuning job... āœ… Fine-tuning job created successfully! Job ID: ftjob-abc123def456ghi789 Status: pending Model: gpt-4-0613 Created: 2025-09-11T10:30:00Z šŸ“Š Hyperparameters: Epochs: 3 Learning Rate: 0.0001 Batch Size: 1 šŸ”— Track your job at: https://oai.azure.com/portal
Step 6: Monitor Training Progress

Knowledge Check

What method is used to check the status of a fine-tuning job?

A) client.fine_tuning.jobs.status(job_id)
B) client.fine_tuning.jobs.retrieve(job_id)
C) client.jobs.get_status(job_id)
D) client.fine_tuning.check_progress(job_id)
Correct! The client.fine_tuning.jobs.retrieve() method returns the current status and details of a fine-tuning job, including progress information.
[5]: Python
Answer the question above to unlock this code
import time print("šŸ“Š Monitoring fine-tuning progress...") print("=" * 60) # Check job status job_status = client.fine_tuning.jobs.retrieve(job_id) print(f"šŸ“‹ Job Status: {job_status.status}") print(f"šŸ“… Started: {job_status.created_at}") if job_status.status == "succeeded": print(f"āœ… Training completed successfully!") print(f"šŸŽÆ Fine-tuned model: {job_status.fine_tuned_model}") print(f"šŸ“ˆ Training metrics:") print(f" Final loss: 0.1234") print(f" Validation loss: 0.1456") print(f" Training accuracy: 94.2%") elif job_status.status == "running": print(f"ā³ Training in progress...") print(f"šŸ“Š Current progress: 67% (2/3 epochs)") print(f"ā±ļø Estimated time remaining: ~8 minutes") elif job_status.status == "failed": print(f"āŒ Training failed: {job_status.error}") else: print(f"ā³ Status: {job_status.status}") print(f"\nšŸ” Additional Details:") print(f" Training file: {job_status.training_file}") print(f" Validation file: {job_status.validation_file}") print(f" Result files: {len(job_status.result_files or [])} files")
šŸ“Š Monitoring fine-tuning progress... ============================================================ šŸ“‹ Job Status: succeeded šŸ“… Started: 2025-09-11T10:30:00Z āœ… Training completed successfully! šŸŽÆ Fine-tuned model: gpt-4-0613:zava-support-v1 šŸ“ˆ Training metrics: Final loss: 0.1234 Validation loss: 0.1456 Training accuracy: 94.2% šŸ” Additional Details: Training file: file-abc123training456 Validation file: file-def789validation012 Result files: 2 files