質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

Jetson NanoでCNNの推論を実行した際にGPUが動作していない問題に関して

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 48

質問

お世話になります。

JetsnNanoを用いてエッジ側で画像処理を行っているのですが、「GPUで推論が出来ておらず、CPUよりもGPUの推論速度が遅い現象」が起きております。

以下に示す「試したこと」を受け、「確認したこと」を実施しました。

症状としては恐らくGPUでの推論が出来ておらず、推論時間が掛かっていることが原因だと思われます。

そこで質問なのですが、そもそもこのプログラムの書き方で正しいのでしょうか?

参考文献及び公式にチュートリアルを参考にしたのですが、いまいち分かりかねるためまずは問題の切り分けを行いたいと考えています。

またJetsonの設定場合が原因の場合、何かしら参考になるリファレンスを教えていただけると幸いです。

試したこと

CPUで動作するプログラム、GPUで動作するプログラム2つのプログラムを用いて推論時間を実測。

# coding: utf-8

# パッケージのimport
import numpy as np
import json
from PIL import Image
import torch
import torchvision
from torchvision import models, transforms

print("PyTorch Version: ",torch.__version__)
print("Torchvision Version: ",torchvision.__version__)

use_pretrained = True  # 学習済みのパラメータを使用
net = models.vgg16(pretrained=use_pretrained)
net.eval()  # 推論モードに設定

# 入力画像の前処理のクラス
class BaseTransform():
    def __init__(self, resize, mean, std):
        self.base_transform = transforms.Compose([
            transforms.Resize(resize),  # 短い辺の長さがresizeの大きさになる
            transforms.CenterCrop(resize),  # 画像中央をresize × resizeで切り取り
            transforms.ToTensor(),  # Torchテンソルに変換
            transforms.Normalize(mean, std)  # 色情報の標準化
        ])

    def __call__(self, img):
        return self.base_transform(img)

# 画像前処理の動作を確認
# 1. 画像読み込み
image_file_path = './data/goldenretriever-3724972_640.jpg'
img = Image.open(image_file_path)  # [高さ][幅][色RGB]

# 3. 画像の前処理と処理済み画像の表示
resize = 224
mean = (0.485, 0.456, 0.406)
std = (0.229, 0.224, 0.225)
transform = BaseTransform(resize, mean, std)
img_transformed = transform(img)  # torch.Size([3, 224, 224])

# 出力結果からラベルを予測する後処理クラスを作成
ILSVRC_class_index = json.load(open('./data/imagenet_class_index.json', 'r'))
ILSVRC_class_index

# 出力結果からラベルを予測する後処理クラス
class ILSVRCPredictor():
    def __init__(self, class_index):
        self.class_index = class_index

    def predict_max(self, out):
        maxid = np.argmax(out.detach().cpu().numpy())
        predicted_label_name = self.class_index[str(maxid)][1]

        return predicted_label_name

# GPUが使えるかを確認
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("使用デバイス:", device)

# ネットワークをGPUへ
net = net.to(device)

# 学習済みVGGモデルで手元の画像を予測
# ILSVRCのラベル情報をロードし辞意書型変数を生成します
ILSVRC_class_index = json.load(open('./data/imagenet_class_index.json', 'r'))
predictor = ILSVRCPredictor(ILSVRC_class_index)

# 入力画像を読み込む
image_file_path = './data/goldenretriever-3724972_640.jpg'
img = Image.open(image_file_path)  # [高さ][幅][色RGB]

# 前処理の後、バッチサイズの次元を追加する
transform = BaseTransform(resize, mean, std)  # 前処理クラス作成
img_transformed = transform(img)  # torch.Size([3, 224, 224])
inputs = img_transformed.unsqueeze_(0)  # torch.Size([1, 3, 224, 224])

# GPUが使えるならGPUにデータを送る
inputs = inputs.to(device)

# モデルに入力し、モデル出力をラベルに変換する
out = net(inputs)  # torch.Size([1, 1000])
result = predictor.predict_max(out)

# 予測結果を出力する
print("入力画像の予測結果:", result)

確認したこと

プログラムのどこで時間が掛かっているかの確認

out = net(inputs)  # torch.Size([1, 1000])

にて、処理時間を要していることを実測で確認。

フレームワークが正しくインストールされているかの確認

jetson@jetson-desktop:~$ python3
Python 3.6.8 (default, Oct  7 2019, 12:59:55) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

> > > import torch
> > > print(torch.__version__)
> > > 1.2.0a0+8554416
> > > print('CUDA available: ' + str(torch.cuda.is_available()))
> > > CUDA available: True
> > > a = torch.cuda.FloatTensor(2).zero_()
> > > print('Tensor a = ' + str(a))
> > > Tensor a = tensor([0., 0.], device='cuda:0')
> > > b = torch.randn(2).cuda()
> > > print('Tensor b = ' + str(b))
> > > Tensor b = tensor([0.4261, 2.1705], device='cuda:0')
> > > c = a + b
> > > print('Tensor c = ' + str(c))
> > > Tensor c = tensor([0.4261, 2.1705], device='cuda:0')

> > > import torchvision
> > > print(torchvision.__version__)
> > > 0.2.2

https://devtalk.nvidia.com/default/topic/1049071/jetson-nano/pytorch-for-jetson-nano/

GPUの動作を確認

tegrastats と gpuGraph を使い確認したが、若干の動きはあるものの通常の画面操作と同程度なので、GPUが動いていないように見受けられる。

開発環境

・JetsonNano jetson-nano-sd-r32.2-2019-07-16 でイメージを作成

・ubntu 18.04

・PyTorch v1.3.0

・VSCode上で.pyを編集

参考文献(サイト)

PyTorchでBERTなど各種DLモデルを作りながら学ぶ書籍を執筆しました
YutaroOgawa/pytorch_advanced1-1_load_vgg.ipynbを参照

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る