From 31ba987ee586c8c1bc24c8c0e3e3c48b743f2c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Formanek=20Bal=C3=A1zs=20Istv=C3=A1n?= <formanek.balazs.istvan@itk.ppke.hu> Date: Thu, 21 Nov 2024 20:44:58 +0100 Subject: [PATCH] finalise inference time measurement --- Balanced Accuracy vs. Rotation.png | Bin 46135 -> 0 bytes copy_best_models_to_local.py | 2 + inference_time_measure.ipynb | 163 ----- time_measure.py | 24 +- .../final_local_time_measurement_log.txt | 631 ++++++++++++++++++ .../local_cpu_time_measurement_log.txt | 0 .../local_time_measurement_log.txt | 0 .../time_measurement_log.txt | 0 8 files changed, 655 insertions(+), 165 deletions(-) delete mode 100644 Balanced Accuracy vs. Rotation.png delete mode 100644 inference_time_measure.ipynb create mode 100644 time_measurement/final_local_time_measurement_log.txt rename local_cpu_time_measurement_log.txt => time_measurement/local_cpu_time_measurement_log.txt (100%) rename local_time_measurement_log.txt => time_measurement/local_time_measurement_log.txt (100%) rename time_measurement_log.txt => time_measurement/time_measurement_log.txt (100%) diff --git a/Balanced Accuracy vs. Rotation.png b/Balanced Accuracy vs. Rotation.png deleted file mode 100644 index 1dc1c97dbf2c4cfb97dcd461eebf592c2d0a50b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46135 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 diff --git a/copy_best_models_to_local.py b/copy_best_models_to_local.py index 567082c..44545d2 100644 --- a/copy_best_models_to_local.py +++ b/copy_best_models_to_local.py @@ -1,3 +1,5 @@ +# Copy best models to local folder defined by the folders, the model names and the epoch number +# This is an important preliminary step for inference time measurement. import shutil import os diff --git a/inference_time_measure.ipynb b/inference_time_measure.ipynb deleted file mode 100644 index 312ab6a..0000000 --- a/inference_time_measure.ipynb +++ /dev/null @@ -1,163 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I cannot work in the virtual environment I created, because it does not have cuda installed with torch. I cannot uptadte it, because it is sotred in the travail folder. \\\n", - "Temporary solutions:\n", - " 1) use ipynb kernels, because venv works in them\n", - " 2) use py scripts with tensorflow2 environment\n", - " \n", - "Best solution: \\\n", - "Create environment for us to store it on travail. I don't know how to do it." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Selected image path: /net/travail/bformanek/MRI_dataset/test/T1wCE/136797_T1_3D_EG_ISO_CS_301_1818.4672_2_335.png\n", - "cuda is available\n", - "Image loaded in 211.623669 ms\n", - "Loading model avp_025.pkl\n", - "Model loaded in 26.603460 ms\n", - "Prediction time for one image: 1.088381 ms\n", - "Compete inference time for one image: 239.736557 ms\n" - ] - } - ], - "source": [ - "import torch\n", - "import torchvision.transforms as transforms\n", - "from torchvision.datasets import ImageFolder\n", - "from torch.utils.data import DataLoader\n", - "import time\n", - "import random\n", - "import os\n", - "from PIL import Image\n", - "\n", - "\n", - "# find arandom image to evaluate, this might be given for a user input\n", - "# Get a random image path from the TEST_FOLDER\n", - "def get_random_image_path(folder):\n", - " # Get all subfolders and files\n", - " all_images = []\n", - " for subdir, _, files in os.walk(folder):\n", - " for file in files:\n", - " if file.endswith(('jpg', 'png', 'jpeg')):\n", - " all_images.append(os.path.join(subdir, file))\n", - " \n", - " # Choose a random image path\n", - " random_image_path = random.choice(all_images)\n", - " return random_image_path\n", - "\n", - "# Randomly select an image path\n", - "TEST_FOLDER = '/net/travail/bformanek/MRI_dataset/test'\n", - "image_path = get_random_image_path(TEST_FOLDER)\n", - "print(f\"Selected image path: {image_path}\")\n", - "\n", - "# inputs\n", - "model_path = '/net/travail/bformanek/checkpoints/transfer_checkpoints_resnet18_adam_amp_criterion_balanced/'\n", - "epoch_number = 25\n", - "device = 'cuda' # 'cpu' \n", - "image_index = 0 # Specify the index of the image you want to evaluate (first image = 0)\n", - "\n", - "# --------------\n", - "# Define number of workers for DataLoader\n", - "WORKERS = 8\n", - "\n", - "# check cuda\n", - "if device == 'cuda':\n", - " if torch.cuda.is_available():\n", - " print('cuda is available')\n", - " else:\n", - " print('cuda is not available, change to cpu')\n", - " device = 'cpu'\n", - "\n", - "# 1) load and transform image\n", - "start_time = time.time()\n", - "load_image_time_start = start_time\n", - "\n", - "# Define the transformation for the test data\n", - "valid_transform = transforms.Compose([\n", - " transforms.Resize(224),\n", - " transforms.ToTensor()\n", - "])\n", - "\n", - "# Load the image and apply transformations\n", - "image = Image.open(image_path).convert('RGB')\n", - "image = valid_transform(image).unsqueeze(0) # Add batch dimension\n", - "\n", - "load_image_time_end = time.time()\n", - "load_image_time = (load_image_time_end - load_image_time_start) * 1000\n", - "print(f'Image loaded in {load_image_time:02f} ms')\n", - "\n", - "\n", - "# 2) Measure Model Loading Time\n", - "# Get the model name\n", - "model_name = f'avp_{epoch_number:03d}.pkl'\n", - "print(\"Loading model \" + model_name)\n", - "\n", - "load_model_time_start = time.time() # start timer\n", - "model = torch.load(model_path+model_name, map_location=torch.device('cpu'), weights_only=False)\n", - "model.to(device)\n", - "load_model_time_end = time.time()\n", - "\n", - "load_model_time = (load_model_time_end - load_model_time_start) * 1000 # elapsed time in milliseconds\n", - "print(f'Model loaded in {load_model_time:02f} ms')\n", - "\n", - "# Set model to evaluation mode\n", - "model.eval()\n", - "\n", - "# 3) Predict on the single image\n", - "image = image.to(device)\n", - "prediction_time_start = time.time()\n", - "with torch.no_grad():\n", - " # Perform prediction\n", - " output = model(image)\n", - " \n", - "end_time = time.time()\n", - "prediction_time = (end_time - prediction_time_start) * 1000\n", - "print(f'Prediction time for one image: {prediction_time:02f} ms')\n", - "\n", - "inference_time = (end_time - start_time) * 1000\n", - "print(f'Compete inference time for one image: {inference_time:02f} ms')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/time_measure.py b/time_measure.py index e043c52..e08d3df 100644 --- a/time_measure.py +++ b/time_measure.py @@ -1,3 +1,19 @@ +# Infernece time measurement: +# Measure inference times for a set of models in a folder (local_model_folder) with random sample images from the datast (test_image_folder) +# Needed: +# - models loaded into local folder (use copy_best_models_to_local.py) +# - define local and server folders, and the number of measurements +# Script: +# 0) iterate through the number of measurements +# 1) copy a random image from the dataset to local (for moer reliable masurement results) +# 2) evaluate cpu and gpu inference times and gpu memory for every model on the sample image +# - on CPU do not use autocast, as the CREMI CPU-s do not support this option +# - on GPU use autocast with float16, and calculate memory usage +# 3) put results to command line +# 4) remove sample image from local +# Results: +# Log rasults can be found in ./time_measurement folder + import torch import torchvision.transforms as transforms from torchvision.datasets import ImageFolder @@ -77,8 +93,11 @@ def inference_time_measurement(model_path, image_path, transform, device = 'cuda image = image.to(device) prediction_time_start = time.time() with torch.no_grad(): - with torch.autocast(device_type=device, dtype=torch.bfloat16): - # Perform prediction + if device == 'cuda': + with torch.autocast(device_type=device, dtype=torch.bfloat16): + # Perform prediction + output = model(image) + else: output = model(image) end_time = time.time() @@ -104,6 +123,7 @@ transform = transforms.Compose([ transforms.ToTensor() ]) +# Define folders test_image_folder = '/net/travail/bformanek/MRI_dataset/test' local_images_folder = '/net/cremi/bformanek/TRDP_II/local_images/' local_model_folder = '/net/cremi/bformanek/TRDP_II/local_models/' diff --git a/time_measurement/final_local_time_measurement_log.txt b/time_measurement/final_local_time_measurement_log.txt new file mode 100644 index 0000000..fdce7c9 --- /dev/null +++ b/time_measurement/final_local_time_measurement_log.txt @@ -0,0 +1,631 @@ +DESCRIPTION: + +AUTOCAST with GPU using float16 +NO AUTOCAST with CPU + +LOG: +------------------------------------------------------------------------------ +MEASUREMENT - 1 +Selected image path: /net/travail/bformanek/MRI_dataset/test/T1w/4RTNI_5_S_5006_MR_Sag_IR-SPGR__br_raw_20140821092148809_194_S228381_I440459_2529.7502_0_093.png +Copied to local image path: /net/cremi/bformanek/TRDP_II/local_images/4RTNI_5_S_5006_MR_Sag_IR-SPGR__br_raw_20140821092148809_194_S228381_I440459_2529.7502_0_093.png +MODEL: +transfer_checkpoints_mobilenetv3_small_100.lamb_in1k_avp_028.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 3.98 ms +Model loaded: 6.52 ms +Prediction time for one image: 5.27 ms +Compete inference time for one image: 15.79 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 0.94 ms +Model loaded: 9.77 ms +Prediction time for one image: 2.42 ms +Compete inference time for one image: 13.23 ms +GPU memory usage: 6.49755859375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_efficientnet_b0_adam_amp_criterion_balanced_avp_026.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 28.47 ms +Model loaded: 15.32 ms +Prediction time for one image: 24.02 ms +Compete inference time for one image: 67.83 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.17 ms +Model loaded: 18.94 ms +Prediction time for one image: 4.06 ms +Compete inference time for one image: 24.32 ms +GPU memory usage: 16.53955078125 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.fb_ssl_yfcc100m_ft_in1k_avp_022.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 3.69 ms +Model loaded: 9.40 ms +Prediction time for one image: 16.13 ms +Compete inference time for one image: 29.25 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 2.45 ms +Model loaded: 24.24 ms +Prediction time for one image: 1.60 ms +Compete inference time for one image: 28.44 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_conv_large.e500_r256_in1k_avp_004.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 1.26 ms +Model loaded: 85.45 ms +Prediction time for one image: 24.27 ms +Compete inference time for one image: 111.01 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.20 ms +Model loaded: 58.94 ms +Prediction time for one image: 4.85 ms +Compete inference time for one image: 65.12 ms +GPU memory usage: 121.2021484375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_adam_amp_criterion_balanced_avp_025.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 28.80 ms +Model loaded: 13.67 ms +Prediction time for one image: 15.64 ms +Compete inference time for one image: 58.13 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.30 ms +Model loaded: 16.55 ms +Prediction time for one image: 1.54 ms +Compete inference time for one image: 19.56 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation2_avp_019.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 4.12 ms +Model loaded: 9.74 ms +Prediction time for one image: 10.24 ms +Compete inference time for one image: 24.13 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.23 ms +Model loaded: 15.18 ms +Prediction time for one image: 1.57 ms +Compete inference time for one image: 18.14 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation4_avp_024.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 4.38 ms +Model loaded: 9.80 ms +Prediction time for one image: 8.86 ms +Compete inference time for one image: 23.07 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.26 ms +Model loaded: 15.24 ms +Prediction time for one image: 1.62 ms +Compete inference time for one image: 18.26 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.a2_in1k_avp_012.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.95 ms +Model loaded: 18.90 ms +Prediction time for one image: 30.13 ms +Compete inference time for one image: 82.01 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.34 ms +Model loaded: 16.66 ms +Prediction time for one image: 1.61 ms +Compete inference time for one image: 19.77 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_hybrid_medium.e500_r224_in1k_avp_007.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.95 ms +Model loaded: 33.24 ms +Prediction time for one image: 18.13 ms +Compete inference time for one image: 84.33 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.16 ms +Model loaded: 34.81 ms +Prediction time for one image: 6.98 ms +Compete inference time for one image: 43.10 ms +GPU memory usage: 38.37353515625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet50_adam_amp_criterion_balanced_avp_018.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 3.16 ms +Model loaded: 20.71 ms +Prediction time for one image: 27.57 ms +Compete inference time for one image: 51.46 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.57 ms +Model loaded: 39.49 ms +Prediction time for one image: 3.04 ms +Compete inference time for one image: 44.25 ms +GPU memory usage: 90.79150390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation1_avp_021.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 1.27 ms +Model loaded: 10.05 ms +Prediction time for one image: 255.53 ms +Compete inference time for one image: 266.87 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.28 ms +Model loaded: 15.42 ms +Prediction time for one image: 1.60 ms +Compete inference time for one image: 18.44 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation3_avp_003.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.94 ms +Model loaded: 15.08 ms +Prediction time for one image: 407.00 ms +Compete inference time for one image: 455.05 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.43 ms +Model loaded: 29.72 ms +Prediction time for one image: 1.60 ms +Compete inference time for one image: 32.91 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MEASUREMENT - 2 +Selected image path: /net/travail/bformanek/MRI_dataset/test/T1w/ISYB_sub-0103_T1w_3526.7072_2_121.png +Copied to local image path: /net/cremi/bformanek/TRDP_II/local_images/ISYB_sub-0103_T1w_3526.7072_2_121.png +MODEL: +transfer_checkpoints_mobilenetv3_small_100.lamb_in1k_avp_028.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 5.28 ms +Model loaded: 7.64 ms +Prediction time for one image: 136.10 ms +Compete inference time for one image: 149.04 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.27 ms +Model loaded: 12.64 ms +Prediction time for one image: 2.95 ms +Compete inference time for one image: 16.98 ms +GPU memory usage: 6.49755859375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_efficientnet_b0_adam_amp_criterion_balanced_avp_026.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 2.26 ms +Model loaded: 12.94 ms +Prediction time for one image: 380.81 ms +Compete inference time for one image: 396.03 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.46 ms +Model loaded: 27.35 ms +Prediction time for one image: 4.11 ms +Compete inference time for one image: 33.06 ms +GPU memory usage: 16.53955078125 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.fb_ssl_yfcc100m_ft_in1k_avp_022.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 2.46 ms +Model loaded: 9.83 ms +Prediction time for one image: 21.66 ms +Compete inference time for one image: 33.97 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.23 ms +Model loaded: 14.93 ms +Prediction time for one image: 1.58 ms +Compete inference time for one image: 17.89 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_conv_large.e500_r256_in1k_avp_004.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 7.52 ms +Model loaded: 85.92 ms +Prediction time for one image: 43.71 ms +Compete inference time for one image: 137.19 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.29 ms +Model loaded: 60.78 ms +Prediction time for one image: 4.80 ms +Compete inference time for one image: 67.02 ms +GPU memory usage: 121.2021484375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_adam_amp_criterion_balanced_avp_025.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 28.82 ms +Model loaded: 15.69 ms +Prediction time for one image: 17.49 ms +Compete inference time for one image: 62.04 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.30 ms +Model loaded: 19.76 ms +Prediction time for one image: 1.54 ms +Compete inference time for one image: 22.74 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation2_avp_019.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 7.35 ms +Model loaded: 9.51 ms +Prediction time for one image: 84.01 ms +Compete inference time for one image: 100.89 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.36 ms +Model loaded: 16.25 ms +Prediction time for one image: 1.61 ms +Compete inference time for one image: 19.37 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation4_avp_024.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.93 ms +Model loaded: 11.99 ms +Prediction time for one image: 18.92 ms +Compete inference time for one image: 63.87 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.40 ms +Model loaded: 23.62 ms +Prediction time for one image: 1.62 ms +Compete inference time for one image: 26.79 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.a2_in1k_avp_012.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 46.28 ms +Model loaded: 10.31 ms +Prediction time for one image: 10.48 ms +Compete inference time for one image: 67.10 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.31 ms +Model loaded: 20.27 ms +Prediction time for one image: 1.61 ms +Compete inference time for one image: 23.34 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_hybrid_medium.e500_r224_in1k_avp_007.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 2.57 ms +Model loaded: 24.57 ms +Prediction time for one image: 16.35 ms +Compete inference time for one image: 43.52 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.13 ms +Model loaded: 34.75 ms +Prediction time for one image: 7.01 ms +Compete inference time for one image: 43.04 ms +GPU memory usage: 38.37353515625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet50_adam_amp_criterion_balanced_avp_018.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 6.96 ms +Model loaded: 19.64 ms +Prediction time for one image: 142.76 ms +Compete inference time for one image: 169.39 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.36 ms +Model loaded: 39.25 ms +Prediction time for one image: 3.17 ms +Compete inference time for one image: 43.94 ms +GPU memory usage: 90.79150390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation1_avp_021.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 26.83 ms +Model loaded: 10.12 ms +Prediction time for one image: 12.16 ms +Compete inference time for one image: 49.14 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.37 ms +Model loaded: 17.14 ms +Prediction time for one image: 1.58 ms +Compete inference time for one image: 20.25 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation3_avp_003.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 31.86 ms +Model loaded: 11.45 ms +Prediction time for one image: 18.18 ms +Compete inference time for one image: 61.52 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.49 ms +Model loaded: 24.23 ms +Prediction time for one image: 1.63 ms +Compete inference time for one image: 27.50 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MEASUREMENT - 3 +Selected image path: /net/travail/bformanek/MRI_dataset/test/T1w/ADNI_035_S_0048_MR_MPR-R__GradWarp__B1_Correction__N3_Br_20070319172419398_S10258_I45187_617.3637_0_091.png +Copied to local image path: /net/cremi/bformanek/TRDP_II/local_images/ADNI_035_S_0048_MR_MPR-R__GradWarp__B1_Correction__N3_Br_20070319172419398_S10258_I45187_617.3637_0_091.png +MODEL: +transfer_checkpoints_mobilenetv3_small_100.lamb_in1k_avp_028.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 2.09 ms +Model loaded: 9.40 ms +Prediction time for one image: 6.46 ms +Compete inference time for one image: 17.96 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.12 ms +Model loaded: 11.47 ms +Prediction time for one image: 2.75 ms +Compete inference time for one image: 15.48 ms +GPU memory usage: 6.49755859375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_efficientnet_b0_adam_amp_criterion_balanced_avp_026.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 31.17 ms +Model loaded: 18.73 ms +Prediction time for one image: 99.50 ms +Compete inference time for one image: 149.42 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.40 ms +Model loaded: 27.61 ms +Prediction time for one image: 4.06 ms +Compete inference time for one image: 33.22 ms +GPU memory usage: 16.53955078125 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.fb_ssl_yfcc100m_ft_in1k_avp_022.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 2.15 ms +Model loaded: 8.53 ms +Prediction time for one image: 16.30 ms +Compete inference time for one image: 27.00 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.22 ms +Model loaded: 23.61 ms +Prediction time for one image: 1.59 ms +Compete inference time for one image: 26.58 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_conv_large.e500_r256_in1k_avp_004.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 31.95 ms +Model loaded: 43.30 ms +Prediction time for one image: 345.96 ms +Compete inference time for one image: 421.25 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.27 ms +Model loaded: 107.77 ms +Prediction time for one image: 4.69 ms +Compete inference time for one image: 113.85 ms +GPU memory usage: 121.2021484375 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_adam_amp_criterion_balanced_avp_025.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 6.14 ms +Model loaded: 10.57 ms +Prediction time for one image: 106.17 ms +Compete inference time for one image: 122.91 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.35 ms +Model loaded: 16.23 ms +Prediction time for one image: 1.62 ms +Compete inference time for one image: 19.34 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation2_avp_019.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.94 ms +Model loaded: 10.64 ms +Prediction time for one image: 10.76 ms +Compete inference time for one image: 54.36 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.34 ms +Model loaded: 16.62 ms +Prediction time for one image: 1.61 ms +Compete inference time for one image: 19.71 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation4_avp_024.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 32.93 ms +Model loaded: 10.93 ms +Prediction time for one image: 23.49 ms +Compete inference time for one image: 67.38 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.40 ms +Model loaded: 29.04 ms +Prediction time for one image: 1.79 ms +Compete inference time for one image: 32.44 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18.a2_in1k_avp_012.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 31.93 ms +Model loaded: 10.69 ms +Prediction time for one image: 94.56 ms +Compete inference time for one image: 137.20 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.44 ms +Model loaded: 26.99 ms +Prediction time for one image: 1.66 ms +Compete inference time for one image: 30.24 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_mobilenetv4_hybrid_medium.e500_r224_in1k_avp_007.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 1.82 ms +Model loaded: 26.05 ms +Prediction time for one image: 23.28 ms +Compete inference time for one image: 51.18 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.26 ms +Model loaded: 43.98 ms +Prediction time for one image: 7.86 ms +Compete inference time for one image: 53.24 ms +GPU memory usage: 38.37353515625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet50_adam_amp_criterion_balanced_avp_018.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 1.82 ms +Model loaded: 20.77 ms +Prediction time for one image: 31.45 ms +Compete inference time for one image: 54.08 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.44 ms +Model loaded: 46.23 ms +Prediction time for one image: 3.35 ms +Compete inference time for one image: 51.17 ms +GPU memory usage: 90.79150390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation1_avp_021.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 5.67 ms +Model loaded: 9.71 ms +Prediction time for one image: 25.85 ms +Compete inference time for one image: 41.26 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.36 ms +Model loaded: 16.80 ms +Prediction time for one image: 1.61 ms +Compete inference time for one image: 19.90 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +MODEL: +transfer_checkpoints_resnet18_augmentation3_avp_003.pkl +DEVICE: cpu +Inference time masurement using cpu +Image loaded: 30.93 ms +Model loaded: 14.38 ms +Prediction time for one image: 57.81 ms +Compete inference time for one image: 103.15 ms +DEVICE: cuda +cuda is available +Inference time masurement using cuda +Image loaded: 1.48 ms +Model loaded: 23.98 ms +Prediction time for one image: 1.64 ms +Compete inference time for one image: 27.26 ms +GPU memory usage: 43.275390625 MB +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- \ No newline at end of file diff --git a/local_cpu_time_measurement_log.txt b/time_measurement/local_cpu_time_measurement_log.txt similarity index 100% rename from local_cpu_time_measurement_log.txt rename to time_measurement/local_cpu_time_measurement_log.txt diff --git a/local_time_measurement_log.txt b/time_measurement/local_time_measurement_log.txt similarity index 100% rename from local_time_measurement_log.txt rename to time_measurement/local_time_measurement_log.txt diff --git a/time_measurement_log.txt b/time_measurement/time_measurement_log.txt similarity index 100% rename from time_measurement_log.txt rename to time_measurement/time_measurement_log.txt -- GitLab