From a27d0a24d9f16d6b42a2f1c25ab19cd4ad80498d Mon Sep 17 00:00:00 2001 From: deng Date: Sat, 30 Dec 2023 00:03:36 +0800 Subject: [PATCH] use resnet50 to train a cifar10 classifier --- .gitignore | 4 +- README.md | 4 +- dvc.lock | 48 +++++++++++++ dvc.yaml | 39 +++++++---- dvclive/eval/metrics.json | 3 + dvclive/eval/params.yaml | 1 + dvclive/eval/plots/metrics/test_acc.tsv | 2 + dvclive/eval/report.md | 15 ++++ dvclive/eval/static/test_acc.png | Bin 0 -> 13993 bytes dvclive/train/metrics.json | 7 ++ dvclive/train/params.yaml | 5 ++ dvclive/train/plots/metrics/train_acc.tsv | 6 ++ dvclive/train/plots/metrics/train_loss.tsv | 6 ++ dvclive/train/plots/metrics/valid_acc.tsv | 6 ++ dvclive/train/plots/metrics/valid_loss.tsv | 6 ++ dvclive/train/report.md | 21 ++++++ dvclive/train/static/train_acc.png | Bin 0 -> 21095 bytes dvclive/train/static/train_loss.png | Bin 0 -> 20972 bytes dvclive/train/static/valid_acc.png | Bin 0 -> 21554 bytes dvclive/train/static/valid_loss.png | Bin 0 -> 22683 bytes env/pt.yaml | 18 ++++- evaluate.py | 30 ++++++++ params.yaml | 11 ++- prepare.py | 76 +++++++++++++++++++- train.py | 78 ++++++++++++++++++++- utils/__init__.py | 0 utils/dataset.py | 26 +++++++ 27 files changed, 393 insertions(+), 19 deletions(-) create mode 100644 dvc.lock create mode 100644 dvclive/eval/metrics.json create mode 100644 dvclive/eval/params.yaml create mode 100644 dvclive/eval/plots/metrics/test_acc.tsv create mode 100644 dvclive/eval/report.md create mode 100644 dvclive/eval/static/test_acc.png create mode 100644 dvclive/train/metrics.json create mode 100644 dvclive/train/params.yaml create mode 100644 dvclive/train/plots/metrics/train_acc.tsv create mode 100644 dvclive/train/plots/metrics/train_loss.tsv create mode 100644 dvclive/train/plots/metrics/valid_acc.tsv create mode 100644 dvclive/train/plots/metrics/valid_loss.tsv create mode 100644 dvclive/train/report.md create mode 100644 dvclive/train/static/train_acc.png create mode 100644 dvclive/train/static/train_loss.png create mode 100644 dvclive/train/static/valid_acc.png create mode 100644 dvclive/train/static/valid_loss.png create mode 100644 utils/__init__.py create mode 100644 utils/dataset.py diff --git a/.gitignore b/.gitignore index 1ffdb32..b9cea6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ data -*.pt \ No newline at end of file +*.pt +.DS_Store +__pycache__ \ No newline at end of file diff --git a/README.md b/README.md index 659abf8..10edd78 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Abstract -Attempt to use [DVC](https://dvc.ai/), a data versioning tool, to track model training with PyTorch, including data, trained model file, and used parameters. The data will be recorded and pushed to my private DVC remote via webdavšŸŽ +Attempt to use [DVC](https://dvc.ai/), a data versioning tool, to track image classification model training with PyTorch, including data, trained model file, and used parameters. The data will be recorded and pushed to my private DVC remote via webdavšŸŽ # Requirements @@ -11,6 +11,8 @@ Attempt to use [DVC](https://dvc.ai/), a data versioning tool, to track model tr * **env** * **pt.yaml** * conda env yaml to run this repo +* **utils** + * house pre-built functions # Files diff --git a/dvc.lock b/dvc.lock new file mode 100644 index 0000000..5cf30dc --- /dev/null +++ b/dvc.lock @@ -0,0 +1,48 @@ +schema: '2.0' +stages: + prepare: + cmd: python prepare.py + deps: + - path: prepare.py + hash: md5 + md5: a1c07d1d5caf6e5288560a189415785c + size: 2979 + params: + params.yaml: + prepare: + data_dir: data/raw + save_dir: data/processed + train_valid_split: + - 0.7 + - 0.3 + random_seed: 0 + outs: + - path: data/processed + hash: md5 + md5: f4bf62ffa725ca9144b7852a283dc1da.dir + size: 295118798 + nfiles: 60000 + train: + cmd: python train.py + deps: + - path: data/processed + hash: md5 + md5: f4bf62ffa725ca9144b7852a283dc1da.dir + size: 295118798 + nfiles: 60000 + - path: train.py + hash: md5 + md5: b797ccf2fe61952bbf6d83fa51b0b11f + size: 3407 + params: + params.yaml: + train: + data_dir: data/processed + epochs: 5 + batch_size: 256 + learning_rate: 5e-05 + outs: + - path: model.pt + hash: md5 + md5: 8ead2a7cd52d70b359d3cdc3df5e43e3 + size: 102592994 diff --git a/dvc.yaml b/dvc.yaml index ccf68d4..33c2a8a 100644 --- a/dvc.yaml +++ b/dvc.yaml @@ -2,27 +2,42 @@ stages: prepare: cmd: python prepare.py deps: - - prepare.py + - prepare.py params: - - prepare + - prepare outs: - - data/processed + - data/processed train: cmd: python train.py deps: - - data/processed - - train.py + - data/processed + - train.py params: - - train + - train outs: - - model.pt + - model.pt evaluate: cmd: python evaluate.py deps: - - data/processed - - evaluate.py - - model.pt + - data/processed + - evaluate.py + - model.pt params: - - evaluate + - evaluate outs: - - eval \ No newline at end of file + - eval +params: +- dvclive/train/params.yaml +- dvclive/eval/params.yaml +artifacts: + resnet50: + path: model.pt + type: model +metrics: +- dvclive/train/metrics.json +- dvclive/eval/metrics.json +plots: +- dvclive/train/plots/metrics: + x: step +- dvclive/eval/plots/metrics: + x: step diff --git a/dvclive/eval/metrics.json b/dvclive/eval/metrics.json new file mode 100644 index 0000000..59e3ec6 --- /dev/null +++ b/dvclive/eval/metrics.json @@ -0,0 +1,3 @@ +{ + "test_acc": 0.7336928844451904 +} diff --git a/dvclive/eval/params.yaml b/dvclive/eval/params.yaml new file mode 100644 index 0000000..a800f2b --- /dev/null +++ b/dvclive/eval/params.yaml @@ -0,0 +1 @@ +data_dir: data/processed diff --git a/dvclive/eval/plots/metrics/test_acc.tsv b/dvclive/eval/plots/metrics/test_acc.tsv new file mode 100644 index 0000000..f4169b0 --- /dev/null +++ b/dvclive/eval/plots/metrics/test_acc.tsv @@ -0,0 +1,2 @@ +step test_acc +0 0.7336928844451904 diff --git a/dvclive/eval/report.md b/dvclive/eval/report.md new file mode 100644 index 0000000..6e43a9c --- /dev/null +++ b/dvclive/eval/report.md @@ -0,0 +1,15 @@ +# DVC Report + +params.yaml + +| data_dir | +|----------------| +| data/processed | + +metrics.json + +| test_acc | +|------------| +| 0.733693 | + +![static/test_acc](static/test_acc.png) diff --git a/dvclive/eval/static/test_acc.png b/dvclive/eval/static/test_acc.png new file mode 100644 index 0000000000000000000000000000000000000000..27643cda16f142437efb85d5e4e88d01362e8d0e GIT binary patch literal 13993 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 KldX8=*8c<3wjQGZ literal 0 HcmV?d00001 diff --git a/dvclive/train/metrics.json b/dvclive/train/metrics.json new file mode 100644 index 0000000..9a0ddb1 --- /dev/null +++ b/dvclive/train/metrics.json @@ -0,0 +1,7 @@ +{ + "train_loss": 2.2422571182250977, + "train_acc": 0.7347080707550049, + "valid_loss": 2.3184266090393066, + "valid_acc": 0.7381500005722046, + "step": 4 +} diff --git a/dvclive/train/params.yaml b/dvclive/train/params.yaml new file mode 100644 index 0000000..b2dbe4b --- /dev/null +++ b/dvclive/train/params.yaml @@ -0,0 +1,5 @@ +data_dir: data/processed +epochs: 5 +batch_size: 256 +learning_rate: 5e-05 +epoch: 4 diff --git a/dvclive/train/plots/metrics/train_acc.tsv b/dvclive/train/plots/metrics/train_acc.tsv new file mode 100644 index 0000000..3535742 --- /dev/null +++ b/dvclive/train/plots/metrics/train_acc.tsv @@ -0,0 +1,6 @@ +step train_acc +0 0.6712241768836975 +1 0.6976224184036255 +2 0.7157850861549377 +3 0.7277812957763672 +4 0.7347080707550049 diff --git a/dvclive/train/plots/metrics/train_loss.tsv b/dvclive/train/plots/metrics/train_loss.tsv new file mode 100644 index 0000000..26010c9 --- /dev/null +++ b/dvclive/train/plots/metrics/train_loss.tsv @@ -0,0 +1,6 @@ +step train_loss +0 3.0726168155670166 +1 2.7409346103668213 +2 2.5224294662475586 +3 2.364570140838623 +4 2.2422571182250977 diff --git a/dvclive/train/plots/metrics/valid_acc.tsv b/dvclive/train/plots/metrics/valid_acc.tsv new file mode 100644 index 0000000..9818ddd --- /dev/null +++ b/dvclive/train/plots/metrics/valid_acc.tsv @@ -0,0 +1,6 @@ +step valid_acc +0 0.6918894052505493 +1 0.7131190896034241 +2 0.7261338233947754 +3 0.7339118123054504 +4 0.7381500005722046 diff --git a/dvclive/train/plots/metrics/valid_loss.tsv b/dvclive/train/plots/metrics/valid_loss.tsv new file mode 100644 index 0000000..a556569 --- /dev/null +++ b/dvclive/train/plots/metrics/valid_loss.tsv @@ -0,0 +1,6 @@ +step valid_loss +0 2.890321969985962 +1 2.669679880142212 +2 2.5183584690093994 +3 2.4061686992645264 +4 2.3184266090393066 diff --git a/dvclive/train/report.md b/dvclive/train/report.md new file mode 100644 index 0000000..e584bb1 --- /dev/null +++ b/dvclive/train/report.md @@ -0,0 +1,21 @@ +# DVC Report + +params.yaml + +| data_dir | epochs | batch_size | learning_rate | epoch | +|----------------|----------|--------------|-----------------|---------| +| data/processed | 5 | 256 | 5e-05 | 4 | + +metrics.json + +| train_loss | train_acc | valid_loss | valid_acc | step | +|--------------|-------------|--------------|-------------|--------| +| 2.24226 | 0.734708 | 2.31843 | 0.73815 | 4 | + +![static/valid_loss](static/valid_loss.png) + +![static/train_acc](static/train_acc.png) + +![static/valid_acc](static/valid_acc.png) + +![static/train_loss](static/train_loss.png) diff --git a/dvclive/train/static/train_acc.png b/dvclive/train/static/train_acc.png new file mode 100644 index 0000000000000000000000000000000000000000..cda099639b5f07879c9c00641e7781ffb84a401e GIT binary patch literal 21095 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 literal 0 HcmV?d00001 diff --git a/dvclive/train/static/train_loss.png b/dvclive/train/static/train_loss.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a49db29162952e85bba21e5f914bf2195e6dd1 GIT binary patch literal 20972 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%0A=&r;}=cJ@P7*7J{FsP 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

0mY)8oKQ4i@JQ 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 None: @@ -17,6 +23,30 @@ def evaluate(params_path: str = 'params.yaml') -> None: with open(params_path, 'r') as f: params = yaml.safe_load(f) + data_dir = Path(params['evaluate']['data_dir']) + + test_dataset = ProcessedDataset(dataset_dir=data_dir.joinpath('test')) + test_dataloader = DataLoader(test_dataset, batch_size=64) + + device = torch.device('mps') + net = torch.load('model.pt') + net.to(device) + net.eval() + + metric = MulticlassAccuracy(num_classes=10, top_k=1, average='weighted') + metric.to(device) + + with Live(dir='dvclive/eval', report='md') as live: + live.log_params(params['evaluate']) + + for data in test_dataloader: + inputs, labels = data[0].to(device), data[1].to(device) + outputs = net(inputs) + _ = metric(outputs, labels) + test_acc = metric.compute() + + print(f'test_acc:{test_acc}') + live.log_metric('test_acc', float(test_acc.cpu())) if __name__ == '__main__': diff --git a/params.yaml b/params.yaml index 80f5bb5..763681f 100644 --- a/params.yaml +++ b/params.yaml @@ -1,3 +1,12 @@ prepare: + data_dir: data/raw + save_dir: data/processed + train_valid_split: [0.7, 0.3] + random_seed: 0 train: -evaluate: \ No newline at end of file + data_dir: data/processed + epochs: 5 + batch_size: 256 + learning_rate: 0.00005 +evaluate: + data_dir: data/processed \ No newline at end of file diff --git a/prepare.py b/prepare.py index b9dc5cc..0c36846 100644 --- a/prepare.py +++ b/prepare.py @@ -3,9 +3,13 @@ # author: deng # date : 20231228 +from pathlib import Path +from shutil import rmtree +import random +import pickle import yaml -import torch +import numpy as np def prepare(params_path: str = 'params.yaml') -> None: @@ -17,7 +21,75 @@ def prepare(params_path: str = 'params.yaml') -> None: with open(params_path, 'r') as f: params = yaml.safe_load(f) + data_dir = Path(params['prepare']['data_dir']) + save_dir = Path(params['prepare']['save_dir']) + train_valid_split = params['prepare']['train_valid_split'] + random_seed = params['prepare']['random_seed'] + + train_dir = save_dir.joinpath('train') + valid_dir = save_dir.joinpath('valid') + test_dir = save_dir.joinpath('test') + + if train_dir.is_dir(): + rmtree(train_dir) + train_dir.mkdir() + if valid_dir.is_dir(): + rmtree(valid_dir) + valid_dir.mkdir() + if test_dir.is_dir(): + rmtree(test_dir) + test_dir.mkdir() + + # Process training data + ids = list(range(50000)) + random.Random(random_seed).shuffle(ids) + train_ids = ids[:int(50000 * train_valid_split[0])] + valid_ids = ids[int(50000 * train_valid_split[0]):] + + current_id, train_count, valid_count = 0, 0, 0 + cifar_10_dir = data_dir.joinpath('cifar-10-batches-py') + for data_path in cifar_10_dir.glob('data_batch_*'): + with open(data_path, 'rb') as f: + data = pickle.load(f, encoding='bytes') + for i, label in enumerate(data[b'labels']): + x = data[b'data'][i] + x = x.reshape(3, 32, 32) + x = x / 255 + x = x.astype(np.float32) # mps does not support float64 + y = np.zeros(10, dtype=np.float32) + y[label] = 1. + if current_id in train_ids: + npz_path = train_dir.joinpath(f'{train_count}.npz') + train_ids.remove(current_id) + train_count += 1 + else: + npz_path = valid_dir.joinpath(f'{valid_count}.npz') + valid_ids.remove(current_id) + valid_count += 1 + np.savez_compressed( + npz_path, + x=x, + y=y + ) + current_id += 1 + + # Process testing data + data_path = cifar_10_dir.joinpath('test_batch') + with open(data_path, 'rb') as f: + data = pickle.load(f, encoding='bytes') + for i, label in enumerate(data[b'labels']): + x = data[b'data'][i] + x = x.reshape(3, 32, 32) + x = x / 255 + x = x.astype(np.float32) + y = np.zeros(10, dtype=np.float32) + y[label] = 1. + np.savez_compressed( + save_dir.joinpath('test', f'{i}.npz'), + x=x, + y=y + ) if __name__ == '__main__': - prepare() + prepare('params.yaml') diff --git a/train.py b/train.py index fe371e0..56c4480 100644 --- a/train.py +++ b/train.py @@ -3,21 +3,97 @@ # author: deng # date : 20231228 +from pathlib import Path import yaml import torch +from rich.progress import track +from torch.utils.data import DataLoader +from torchvision.models import resnet50 +from torchmetrics.classification import MulticlassAccuracy from dvclive import Live +from utils.dataset import ProcessedDataset + def train(params_path: str = 'params.yaml') -> None: """Train a simple model using Pytorch Args: - params_path (str, optional): path of config yaml. Defaults to 'params.yaml'. + params_path (str, optional): path of parameter yaml. Defaults to 'params.yaml'. """ with open(params_path, 'r') as f: params = yaml.safe_load(f) + data_dir = Path(params['train']['data_dir']) + epochs = params['train']['epochs'] + batch_size = params['train']['batch_size'] + learning_rate = params['train']['learning_rate'] + + train_dataset = ProcessedDataset(dataset_dir=data_dir.joinpath('train')) + valid_dataset = ProcessedDataset(dataset_dir=data_dir.joinpath('valid')) + + train_dataloader = DataLoader(train_dataset, batch_size=batch_size, num_workers=2) + valid_dataloader = DataLoader(valid_dataset, batch_size=batch_size, num_workers=2) + + device = torch.device('mps') + net = torch.nn.Sequential( + resnet50(weights='IMAGENET1K_V1'), + torch.nn.Linear(1000, 10) + ) + net.to(device) + + criterion = torch.nn.CrossEntropyLoss() + optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate) + metric = MulticlassAccuracy(num_classes=10, top_k=1, average='weighted') + metric.to(device) + + with Live(dir='dvclive/train', report='md') as live: + live.log_params(params['train']) + + for epoch in track(range(epochs), 'Epochs'): + + net.train() + train_loss = 0. + for data in train_dataloader: + inputs, labels = data[0].to(device), data[1].to(device) + optimizer.zero_grad() + outputs = net(inputs) + loss = criterion(outputs, labels) + train_loss += loss + loss.backward() + optimizer.step() + _ = metric(outputs, labels) + train_loss /= len(train_dataloader) + train_acc = metric.compute() + metric.reset() + + net.eval() + with torch.no_grad(): + valid_loss = 0. + for data in valid_dataloader: + inputs, labels = data[0].to(device), data[1].to(device) + outputs = net(inputs) + loss = criterion(outputs, labels) + valid_loss += loss + _ = metric(outputs, labels) + valid_loss /= len(valid_dataloader) + valid_acc = metric.compute() + metric.reset() + + print( + f'Epoch {epoch} - train_loss:{train_loss} train_acc:{train_acc} ' + f'valid_loss:{valid_loss} valid_acc:{valid_acc}' + ) + live.log_param('epoch', epoch) + live.log_metric('train_loss', float(train_loss.cpu())) + live.log_metric('train_acc', float(train_acc.cpu())) + live.log_metric('valid_loss', float(valid_loss.cpu())) + live.log_metric('valid_acc', float(valid_acc.cpu())) + live.next_step() + + torch.save(net, 'model.pt') + live.log_artifact('model.pt', type='model', name='resnet50') if __name__ == '__main__': diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/dataset.py b/utils/dataset.py new file mode 100644 index 0000000..08104e7 --- /dev/null +++ b/utils/dataset.py @@ -0,0 +1,26 @@ +# prepare.py +# +# author: deng +# date : 20231229 + +from pathlib import PosixPath + +import torch +import numpy as np +from torch.utils.data import Dataset + + +class ProcessedDataset(Dataset): + """"Load processed data""" + def __init__(self, dataset_dir: PosixPath): + self.dataset_dir = dataset_dir + self.file_paths = list(self.dataset_dir.glob('*.npz')) + + def __len__(self): + return len(self.file_paths) + + def __getitem__(self, idx): + npz = np.load(self.file_paths[idx]) + x = torch.from_numpy(npz['x']) + y = torch.from_numpy(npz['y']) + return x, y