GPUを使って処理速度を向上させたい

実現したいこと

異常画像を検知するONNXモデルを読み込んで、指定した画像を判定するプログラムを作成しました。
この判定するまでの処理速度をできるだけ早くしたいです。
処理速度が速くなる処理方法を教えていただきたいです。

発生している問題・分からないこと

私のPCにはNVIDIA RTX A5000が搭載されているのでGPUを使って処理速度を上げようと試みましたが、なぜかGPUを使うと処理速度を落ちてしまいます。

該当のソースコード

python

1#CPUでの実行2import torch 3import onnxruntime 4from torchvision import transforms 5import time 6import torchvision 7 8#providers = ["CUDAExecutionProvider"]9providers = ["CPUExecutionProvider"]10 11# ONNXファイルの読み込み12model_onnx = "ONNXファイルのパス"13session_model = onnxruntime.InferenceSession(model_onnx, providers=providers)14 15# モデル読み込み16out_channels = 38417on_gpu = torch.cuda.is_available()18image_size = 25619 20transform = transforms.Compose([21 transforms.Resize((image_size, image_size)),22 transforms.ToTensor(),23 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])24])25 26# テスト用データ(10000件のテスト用データ)を保存27testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)28testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)29 30# 予測に必要なパラメータの読み込み31# 訓練データセットの平均、標準偏差など32size = (1, 384, 1, 1)33teacher_mean = torch.rand(*size) #torch.Size([1, 384, 1, 1])34teacher_std = torch.rand(*size) # torch.Size([1, 384, 1, 1])35 36dataiter = iter(testloader)37images, labels = next(dataiter)38image = images[None]39image = image.unsqueeze(0)40image = image[0] #torch.Size([1, 3, 256, 256])41 42start_time = time.time()43input_name = session_model.get_inputs()[0].name 44output_name = session_model.get_outputs()[0].name 45 46# Run inference47output = session_model.run([output_name], {input_name: image.numpy()})48output = torch.tensor(output[0])49output = (output - teacher_mean) / teacher_std #torch.Size([1, 384, 56, 56])50 51end_time = time.time()52execution_time = end_time - start_time 53print(f"処理時間: {execution_time}秒")54print(output)55 56

python

1#GPUでの実行2import torch 3import onnxruntime 4from torchvision import transforms 5import time 6import torchvision 7 8providers = ["CUDAExecutionProvider"]9#providers = ["CPUExecutionProvider"]10 11# ONNXファイルの読み込み12model_onnx = "ONNXファイルのパス"13session_model = onnxruntime.InferenceSession(model_onnx, providers=providers)14 15# モデル読み込み16out_channels = 38417on_gpu = torch.cuda.is_available()18image_size = 25619 20transform = transforms.Compose([21 transforms.Resize((image_size, image_size)),22 transforms.ToTensor(),23 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])24])25 26# テスト用データ(10000件のテスト用データ)を保存27testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)28testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)29 30# 予測に必要なパラメータの読み込み31# 訓練データセットの平均、標準偏差など32size = (1, 384, 1, 1)33teacher_mean = torch.rand(*size) #torch.Size([1, 384, 1, 1])34teacher_std = torch.rand(*size) # torch.Size([1, 384, 1, 1])35 36dataiter = iter(testloader)37images, labels = next(dataiter)38image = images[None]39image = image.unsqueeze(0)40image = image[0] #torch.Size([1, 3, 256, 256])41 42start_time = time.time()43input_name = session_model.get_inputs()[0].name 44output_name = session_model.get_outputs()[0].name 45 46# Run inference47output = session_model.run([output_name], {input_name: image.numpy()})48output = torch.tensor(output[0])49output = (output - teacher_mean) / teacher_std #torch.Size([1, 384, 56, 56])50 51end_time = time.time()52execution_time = end_time - start_time 53print(f"処理時間: {execution_time}秒")54print(output)55 56

試したこと・調べたこと

上記の詳細・結果

session_model = onnxruntime.InferenceSession(model_onnx, providers=providers)の部分でprvidersを"DmlExecutionProvider"に指定したらGPUで推論できて処理速度が速くなると思っていましたが、"CPUExecutionProvider"のほうが速度が速くなりました。

補足

ソースコードには実際のファイルパスなどの記載は控えさせていただきました。
入力データは仮のものとしてCIFAR10を入力とさせていただいております。
とにかく処理速度が速度にフォーカスしてご質問させていただきました。

コメントを投稿

0 コメント