This document covers the advanced features added to the SLM Builder package, including dataset splitting, database loaders, API loaders, and model comparison.
fromslm_builder.dataimportDatasetValidatorvalidator=DatasetValidator()# Validate dataset
report=validator.validate_dataset(dataset,task='qa',# or 'classification', 'instruction', 'generation'
strict=False# Set to True to raise on errors
)print(f"Valid samples: {report['valid_samples']}/{report['total_samples']}")print(f"Validity rate: {report['validity_rate']:.2%}")print(f"Errors: {len(report['errors'])}")print(f"Warnings: {len(report['warnings'])}")# Check class balance
distribution=validator.check_class_balance(dataset,stratify_by='label.label')print(f"Classes: {distribution['n_classes']}")print(f"Balanced: {distribution['is_balanced']}")print(f"Imbalance ratio: {distribution['imbalance_ratio']:.2f}")
Convenience Functions
1
2
3
4
5
6
7
8
9
10
fromslm_builder.dataimportsplit_dataset,validate_dataset# Simple split
train,test=split_dataset(dataset,test_size=0.2)# With validation set
train,val,test=split_dataset(dataset,test_size=0.15,val_size=0.15)# Validate
report=validate_dataset(dataset,task='qa',strict=False)
Database Loaders
Overview
Load data directly from SQL and NoSQL databases.
Supported Databases
SQL: PostgreSQL, MySQL, SQLite, and other SQLAlchemy-compatible databases
NoSQL: MongoDB
SQL Loader
Requirements
1
2
pip install sqlalchemy psycopg2-binary # For PostgreSQL
pip install sqlalchemy pymysql # For MySQL
fromslm_builder.dataimportload_from_sql# Connection parameters
connection_params={'dialect':'postgresql',# or 'mysql', 'sqlite'
'host':'localhost','port':5432,'database':'mydb','user':'username','password':'password'}# SQL query
query="""
SELECT
id,
question_text as text,
answer_text,
metadata
FROM qa_table
WHERE status = 'active'
LIMIT 1000
"""# Column mapping (maps database columns to canonical format)
column_mapping={'text':'question_text','label.answer':'answer_text'}# Load data
records=load_from_sql(query=query,connection_params=connection_params,task='qa',column_mapping=column_mapping)print(f"Loaded {len(records)} records from SQL database")
SQLite Example
1
2
3
4
5
6
7
8
connection_params={'dialect':'sqlite','database':'/path/to/database.db'}query="SELECT * FROM training_data"records=load_from_sql(query,connection_params,task='classification')
Custom Response Parsers: Handle different API response structures
Progress Tracking: Visual progress with tqdm
Usage
Basic API Loading
1
2
3
4
5
6
7
8
9
fromslm_builder.dataimportload_from_api# Simple API without authentication
records=load_from_api(base_url='https://api.example.com',endpoint='/v1/data',task='qa',max_pages=10)
records=load_from_api(base_url='https://api.example.com',endpoint='/data',task='qa',rate_limit=2.0,# 2 requests per second
max_pages=100)
Custom Response Parser
1
2
3
4
5
6
7
8
9
10
11
12
13
defcustom_parser(response):"""Extract data from custom API response format."""if'payload'inresponse:returnresponse['payload']['items']return[]loader=APILoader(task='qa')records=loader.load(base_url='https://api.example.com',endpoint='/custom',response_parser=custom_parser,max_pages=10)
Model Comparison and Benchmarking
Overview
Compare multiple models on the same dataset and track experiments.
fromslm_builder.modelsimportExperimentTrackertracker=ExperimentTracker(tracking_dir='./experiments')# Log experiment
experiment_id=tracker.log_experiment(experiment_name='baseline_training',model_name='gpt2',hyperparameters={'learning_rate':5e-5,'batch_size':16,'epochs':3,'lora_r':8,'lora_alpha':16},metrics={'train_loss':2.35,'eval_loss':2.42,'perplexity':11.2,'accuracy':0.87},notes='Baseline training with LoRA')print(f"Experiment logged: {experiment_id}")# List all experiments
experiments=tracker.list_experiments()print(f"Total experiments: {len(experiments)}")# Filter by model
gpt2_experiments=tracker.list_experiments(model_filter='gpt2')print(f"GPT-2 experiments: {len(gpt2_experiments)}")# Get best experiment
best_exp=tracker.get_best_experiment(metric='perplexity',minimize=True,# Lower perplexity is better
model_filter='gpt2')print(f"Best experiment: {best_exp['id']}")print(f"Best perplexity: {best_exp['metrics']['perplexity']:.4f}")
fromslm_builder.dataimportload_from_apifromslm_builderimportSLMBuilder# Load from API with authentication and pagination
auth={'type':'bearer','token':'your-api-token'}pagination={'type':'offset','param':'offset','size_param':'limit','page_size':100}dataset=load_from_api(base_url='https://api.yourcompany.com',endpoint='/training-data',task='instruction',auth=auth,pagination=pagination,rate_limit=5.0,# 5 requests per second
max_pages=50)print(f"Loaded {len(dataset)} records from API")# Use with SLMBuilder
builder=SLMBuilder(project_name='api_trained_model',base_model='gpt2',task='instruction')builder.prepare_data(dataset)builder.train(epochs=3)
Performance Considerations
Dataset Splitting
Stratified splitting ensures balanced class distribution