training-scripts / train_qwen3_telecom.py
wlabchoi's picture
Upload train_qwen3_telecom.py with huggingface_hub
f9c8c49 verified
# /// script
# dependencies = ["trl>=0.12.0", "peft>=0.7.0", "trackio", "datasets", "transformers", "accelerate", "bitsandbytes"]
# ///
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig
import trackio
# Load and preprocess the TeleQnA dataset
print('Loading TeleQnA dataset...')
raw_dataset = load_dataset('netop/TeleQnA', split='test')
def format_for_sft(example):
"""Convert TeleQnA format to chat messages format"""
# Dataset columns: question, choices, answer, subject, explaination
# Build the question with choices
choices_text = []
if 'choices' in example and example['choices']:
for i, choice in enumerate(example['choices'], 1):
choices_text.append(f'{i}. {choice}')
question_with_options = f"""{example['question']}
Options:
{chr(10).join(choices_text)}"""
# Build the answer with explanation (note: misspelled as 'explaination' in dataset)
explanation = example.get('explaination', '') or example.get('explanation', '')
answer_text = f"""{example['answer']}
Explanation: {explanation}"""
# Format as chat messages
return {
'messages': [
{'role': 'user', 'content': question_with_options},
{'role': 'assistant', 'content': answer_text}
]
}
print('Preprocessing dataset...')
dataset = raw_dataset.map(format_for_sft, remove_columns=raw_dataset.column_names)
# Create train/eval split (90/10)
print('Creating train/eval split...')
dataset_split = dataset.train_test_split(test_size=0.1, seed=42)
print(f'Train examples: {len(dataset_split["train"])}')
print(f'Eval examples: {len(dataset_split["test"])}')
# Configure LoRA for efficient fine-tuning
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
bias="none",
task_type="CAUSAL_LM"
)
# Configure SFT training
training_args = SFTConfig(
output_dir="qwen3-telecom-finetuned",
# Training hyperparameters
num_train_epochs=3,
per_device_train_batch_size=2,
per_device_eval_batch_size=2,
gradient_accumulation_steps=8, # Effective batch size = 16
# Optimization
learning_rate=2e-4,
lr_scheduler_type="cosine",
warmup_ratio=0.1,
# Evaluation and saving
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=200,
save_total_limit=3,
# Logging and monitoring
logging_steps=10,
report_to="trackio",
run_name="qwen3-0.6b-telecom-domain-adaptation",
project="telecom-finetuning",
# Memory optimization
gradient_checkpointing=True,
bf16=True,
# Hub integration
push_to_hub=True,
hub_model_id="wlabchoi/qwen3-0.6b-telecom",
hub_strategy="every_save",
hub_private_repo=False,
)
# Initialize trainer
print('Initializing SFT trainer...')
trainer = SFTTrainer(
model="Qwen/Qwen3-0.6B",
train_dataset=dataset_split["train"],
eval_dataset=dataset_split["test"],
peft_config=peft_config,
args=training_args,
)
# Start training
print('Starting training...')
trainer.train()
# Push final model to Hub
print('Pushing final model to Hub...')
trainer.push_to_hub(commit_message="Training complete - Qwen3-0.6B fine-tuned on TeleQnA")
print('Training completed successfully!')