diff --git a/hpvm/test/dnn_benchmarks/pytorch/dnn/__init__.py b/hpvm/test/dnn_benchmarks/pytorch/dnn/__init__.py
index f4a16c6a2c0767efcac372006abf88f9919a75a9..22e7bfadbc9157814195d4b71d913ffa869a0fc2 100644
--- a/hpvm/test/dnn_benchmarks/pytorch/dnn/__init__.py
+++ b/hpvm/test/dnn_benchmarks/pytorch/dnn/__init__.py
@@ -1,6 +1,62 @@
+from pathlib import Path
+from typing import Union
+
+import torch
+from torch2hpvm import BinDataset, ModelExporter
+
 from .alexnet import AlexNet, AlexNet2, AlexNetImageNet
 from .datasets import CIFAR, MNIST, ImageNet
 from .lenet import LeNet
-from .vgg16 import VGG16Cifar10, VGG16Cifar100, VGG16ImageNet
 from .mobilenet import MobileNet
 from .resnet import ResNet18, ResNet50
+from .vgg16 import VGG16Cifar10, VGG16Cifar100, VGG16ImageNet
+
+# DNN name -> (DNN class, input_channel, input_size, suggested_batchsize)
+benchmarks = {
+    "lenet_mnist": (LeNet, 1, 28, 1000),
+    "alexnet_cifar10": (AlexNet, 3, 32, 500),
+    "alexnet2_cifar10": (AlexNet2, 3, 32, 500),
+    "alexnet_imagenet": (AlexNetImageNet, 3, 224, 500),
+    "mobilenet_cifar10": (MobileNet, 3, 32, 500),
+    "resnet18_cifar10": (ResNet18, 3, 32, 500),
+    "resnet50_imagenet": (ResNet50, 3, 224, 25),
+    "vgg16_cifar10": (VGG16Cifar10, 3, 32, 500),
+    "vgg16_cifar100": (VGG16Cifar100, 3, 32, 500),
+    "vgg16_imagenet": (VGG16ImageNet, 3, 224, 10),
+}
+
+
+def export_example_dnn(
+    dnn_name: str, output_dir: Union[Path, str], generate_for_tuning: bool
+):
+    self_folder = Path(__file__).parent.absolute()
+    dnn_bench_dir = self_folder / "../.."
+
+    model_cls, nch, img_size, batch_size = benchmarks[dnn_name]
+    dataset_shape = 5000, nch, img_size, img_size
+    params = dnn_bench_dir / "model_params" / dnn_name
+    bin_tuneset = BinDataset(
+        params / "tune_input.bin", params / "tune_labels.bin", dataset_shape
+    )
+    bin_testset = BinDataset(
+        params / "test_input.bin", params / "test_labels.bin", dataset_shape
+    )
+    model: Module = model_cls()
+    checkpoint = dnn_bench_dir / f"model_params/pytorch/{dnn_name}.pth.tar"
+    model.load_state_dict(torch.load(checkpoint.as_posix()))
+
+    build_dir = output_dir / "build"
+    target_binary = build_dir / dnn_name
+    if generate_for_tuning:
+        exporter = ModelExporter(
+            model, bin_tuneset, bin_testset, output_dir, target="hpvm_tensor_inspect"
+        )
+    else:
+        conf_file = (
+            dnn_bench_dir / "hpvm-c/benchmarks" / dnn_name / "data/tuner_confs.txt"
+        ).absolute()
+        exporter = ModelExporter(
+            model, bin_tuneset, bin_testset, output_dir, config_file=conf_file
+        )
+    exporter.generate(batch_size=batch_size).compile(target_binary, build_dir)
+    return target_binary, exporter
diff --git a/hpvm/test/dnn_benchmarks/pytorch/test_frontend/test_frontend.py b/hpvm/test/dnn_benchmarks/pytorch/test_frontend/test_frontend.py
index 56161495d5baa9d570a5d2f36188fe437255de57..f248b7bc259e9b6ebd0ef304991e8df988836010 100755
--- a/hpvm/test/dnn_benchmarks/pytorch/test_frontend/test_frontend.py
+++ b/hpvm/test/dnn_benchmarks/pytorch/test_frontend/test_frontend.py
@@ -5,51 +5,14 @@ from pathlib import Path
 from subprocess import run
 from sys import argv
 
-import torch
-from torch2hpvm import BinDataset, ModelExporter
-from torch.nn import Module
-
-site.addsitedir(Path(__file__).parent.parent.absolute())
+self_folder = Path(__file__).parent.absolute()
+site.addsitedir(self_folder.parent)
 import dnn
 
-benchmarks = {
-    "lenet_mnist": (dnn.LeNet, 1, 28, 1000),
-    "alexnet_cifar10": (dnn.AlexNet, 3, 32, 500),
-    "alexnet2_cifar10": (dnn.AlexNet2, 3, 32, 500),
-    "alexnet_imagenet": (dnn.AlexNetImageNet, 3, 224, 500),
-    "mobilenet_cifar10": (dnn.MobileNet, 3, 32, 500),
-    "resnet18_cifar10": (dnn.ResNet18, 3, 32, 500),
-    "resnet50_imagenet": (dnn.ResNet50, 3, 224, 25),
-    "vgg16_cifar10": (dnn.VGG16Cifar10, 3, 32, 500),
-    "vgg16_cifar100": (dnn.VGG16Cifar100, 3, 32, 500),
-    "vgg16_imagenet": (dnn.VGG16ImageNet, 3, 224, 10),
-}
-self_folder = Path(__file__).parent
 netname = argv[1]
-model_cls, nch, img_size, batch_size = benchmarks[netname]
 codegen_dir = Path(f"./{netname}")
 print(f"Generating {netname} to {codegen_dir}")
 if codegen_dir.exists():
     shutil.rmtree(codegen_dir)
-
-params = self_folder / "../../model_params" / netname
-dataset_shape = 5000, nch, img_size, img_size
-bin_tuneset = BinDataset(
-    params / "tune_input.bin", params / "tune_labels.bin", dataset_shape
-)
-bin_testset = BinDataset(
-    params / "test_input.bin", params / "test_labels.bin", dataset_shape
-)
-model: Module = model_cls()
-checkpoint = self_folder / "../model_params/pytorch" / f"{netname}.pth.tar"
-model.load_state_dict(torch.load(checkpoint.as_posix()))
-print(model)
-
-build_dir = codegen_dir / "build"
-target_binary = build_dir / netname
-conf_file = self_folder / "../hpvm-c/benchmarks" / netname / "data/tuner_confs.txt"
-exporter = ModelExporter(
-    model, bin_tuneset, bin_testset, codegen_dir, config_file=conf_file
-)
-exporter.generate(batch_size=batch_size).compile(target_binary, build_dir)
+target_binary, _ = dnn.export_example_dnn(netname, codegen_dir, False)
 run([str(target_binary), "test"], check=True)
diff --git a/hpvm/test/dnn_benchmarks/pytorch/test_tuning/test_tuning.py b/hpvm/test/dnn_benchmarks/pytorch/test_tuning/test_tuning.py
index 644ce0a2176a4e9a257c6618761eb75da34c1697..746a6d8679f06e1e3aeb14bcdf81432f16a28359 100755
--- a/hpvm/test/dnn_benchmarks/pytorch/test_tuning/test_tuning.py
+++ b/hpvm/test/dnn_benchmarks/pytorch/test_tuning/test_tuning.py
@@ -4,61 +4,33 @@ import site
 from pathlib import Path
 from sys import argv
 
-import torch
-from predtuner import config_pylogger
-from predtuner.pipedbin import PipedBinaryApp
-from torch2hpvm import BinDataset, ModelExporter
-from torch.nn import Module
+from predtuner import PipedBinaryApp, config_pylogger
 
-site.addsitedir(Path(__file__).parent.parent.absolute())
+self_folder = Path(__file__).parent.absolute()
+site.addsitedir(self_folder.parent)
 import dnn
 
 # Set up logger
 msg_logger = config_pylogger(output_dir=".", verbose=True)
-benchmarks = {
-    "lenet_mnist": (dnn.LeNet, 1, 28, 1000),
-    "alexnet_imagenet": (dnn.AlexNetImageNet, 3, 224, 100),
-    "mobilenet_cifar10": (dnn.MobileNet, 3, 32, 500),
-    "resnet18_cifar10": (dnn.ResNet18, 3, 32, 500),
-    "vgg16_cifar10": (dnn.VGG16Cifar10, 3, 32, 500),
-}
-model_param = Path(__file__).parent / "../../model_params"
 
 
 def generate(model_cls, nch, img_size, batch_size, netname):
     codegen_dir = Path(f"./{netname}")
-    build_dir = codegen_dir / "build"
-    metadata_file = codegen_dir / "ops.json"
-    binary_file = build_dir / netname
-    build_dir = codegen_dir / "build"
-
-    if codegen_dir.exists():
-        shutil.rmtree(codegen_dir)
-    params = model_param / netname
-    dataset_shape = 5000, nch, img_size, img_size
-    bin_tuneset = BinDataset(
-        params / "tune_input.bin", params / "tune_labels.bin", dataset_shape
-    )
-    bin_testset = BinDataset(
-        params / "test_input.bin", params / "test_labels.bin", dataset_shape
-    )
-    model: Module = model_cls()
-    checkpoint = model_param / f"pytorch/{netname}.pth.tar"
-    model.load_state_dict(torch.load(checkpoint.as_posix()))
-    exporter = ModelExporter(
-        model, bin_tuneset, bin_testset, codegen_dir, target="hpvm_tensor_inspect"
-    )
-    exporter.generate(batch_size=batch_size).compile(binary_file, build_dir)
+    binary_file, exporter = dnn.export_example_dnn(netname, codegen_dir, True)
+    metadata_file = codegen_dir / exporter.metadata_file
     return binary_file, metadata_file
 
 
 def main():
     netname, is_pred = argv[1:]
     is_pred = int(is_pred)
-    model_cls, nch, img_size, batch_size = benchmarks[netname]
-    binary_file, metadata_file = generate(
-        model_cls, nch, img_size, batch_size, netname
-    )
+    # Generating tunable binary
+    codegen_dir = Path(f"./{netname}")
+    if codegen_dir.exists():
+        shutil.rmtree(codegen_dir)
+    binary_file, exporter = dnn.export_example_dnn(netname, codegen_dir, True)
+    metadata_file = codegen_dir / exporter.metadata_file_name
+    # Tuning
     app = PipedBinaryApp("test", binary_file, metadata_file)
     tuner = app.get_tuner()
     tuner.tune(