LightGTS / test_finetune.py
pchen182224's picture
Upload 9 files
c882c3e verified
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
import pandas as pd
from sklearn.preprocessing import StandardScaler
from tqdm import tqdm
import os
from configuration_LightGTS import LightGTSConfig
from modeling_LightGTS import LightGTSForFinetune
import torch
from transformers import AutoModelForCausalLM
from transformers import AutoModelForCausalLM, MODEL_MAPPING
from transformers import AutoConfig
os.environ['CUDA_VISIBLE_DEVICES']='6'
class TimeSeriesDataset(Dataset):
def __init__(self, df, target_col="HUFL", lookback=528, pred_len=192):
self.lookback = lookback
self.pred_len = pred_len
# 提取目标列
data = df[[target_col]].values
# 强烈建议在微调时进行标准化
self.scaler = StandardScaler()
self.data = self.scaler.fit_transform(data)
def __len__(self):
# 确保有足够的长度来切分一段 lookback + pred_len
return len(self.data) - self.lookback - self.pred_len + 1
def __getitem__(self, idx):
# 获取输入窗口和目标预测窗口
x = self.data[idx : idx + self.lookback]
y = self.data[idx + self.lookback : idx + self.lookback + self.pred_len]
return {
"input": torch.tensor(x, dtype=torch.float32),
"labels": torch.tensor(y, dtype=torch.float32)
}
if __name__=="__main__":
print("Loading data...")
df1 = pd.read_csv("/home/wlf/LightGTS/LightGTS/data/predict_datasets/ETTh1.csv")
lookback_length = 528
target_length = 240
train_dataset = TimeSeriesDataset(df1, target_col="HUFL", lookback=lookback_length, pred_len=target_length)
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True, drop_last=True)
print("Initializing model...")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
LightGTS_config = LightGTSConfig(context_points=528, c_in=1, target_dim=192, patch_len=48, stride=48)
LightGTS_config.save_pretrained("LightGTS-huggingface")
AutoConfig.register("LightGTS",LightGTSConfig)
AutoModelForCausalLM.register(LightGTSConfig, LightGTSForFinetune)
model = AutoModelForCausalLM.from_pretrained(
"./LightGTS-huggingface",
trust_remote_code=True
)
model.loss_fn = nn.MSELoss()
model.to(device)
optimizer = optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-2)
num_epochs = 1
print(f"Starting training on {device} for {num_epochs} epochs...")
for epoch in range(num_epochs):
model.train()
total_loss = 0.0
progress_bar = tqdm(train_dataloader, desc=f"Epoch {epoch+1}/{num_epochs}")
for batch in progress_bar:
inputs = batch["input"].to(device)
labels = batch["labels"].to(device)
optimizer.zero_grad()
outputs = model(input=inputs, labels=labels, target_dim = 240, patch_len = 24, stride = 24)
loss = outputs["loss"]
loss.backward()
optimizer.step()
total_loss += loss.item()
progress_bar.set_postfix({"loss": f"{loss.item():.4f}"})
avg_loss = total_loss / len(train_dataloader)
print(f"Epoch [{epoch+1}/{num_epochs}] completed. Average Loss: {avg_loss:.4f}\n")
model.save_pretrained("./LightGTS-finetuned")
print("Training complete!")