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

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

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

325閲覧

ニューラルネットのテスト段階でもGPU有利でしょうか

insecticide

総合スコア315

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2022/06/11 03:33

編集2022/06/11 08:04

ニューラルネットの訓練段階において莫大な訓練データに対して、GPUで並列・平行実行によって訓練時間短縮を図れますが、テスト段階(推論段階)では
入力データが一つしかないので、それでもGPUを使って実行時間が短縮できるのでしょうか。

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/11 03:53 編集

> 実行時間が短縮できるのでしょうか 比較対象はCPUですか?それとももっと別の何かでしょうか? 参考:ニューラルネットワークは"ax + b"という超シンプルな繋がって計算がいくつも繋がってネットワークになっています。GPUに比べれば(複雑な計算もできる分)賢くしかも高速なCPUでも計算できますが、ネットワークの1つ1つは簡単な計算なので並列処理できるGPUに投げてしまえ、というわけです。
insecticide

2022/06/11 08:06 編集

お返事ありがとうございます >比較対象はCPUですか?それとももっと別の何かでしょうか? そうです。 訓練段階では多量な訓練データを使って並列・並行に行う可能性が高いので(それでもある程度の同期が必要)、一般論としてGPU有利と考えられますが、テストの段階では、一つのデータを入力して、前後順番に計算結果を継承して計算処理をして行かなければならないので、どの辺GPU有利でしょうか。少し具体的なヒントを頂ければと思います。
meg_

2022/06/11 12:06

モデルに拠るかと思いますし、マシンスペックにも拠るかと思います。実際にどのくらい差が出るかは計測しないと分からないのではないでしょうか?他にボトルネックがあればその差は問題にならないかもしれませんし。
guest

回答2

0

ベストアンサー

学習と推論で(体感的に)どれくらい違うか?

ニューラルネットワークの計算には大きく分けて以下の2つがあります。

  • 学習
  • 推論

学習のフェーズでは、多くの場合、ご察しの通り膨大なデータを処理させて都合のいい重みデータを形成させていきますし、推論のフェーズでは、こうして鍛えられた都合のいい重みデータにごく少量のデータだけを流すことになります。もとになるデータの大きさやネットワークの構造にもよると思いますが、学習時には1ステップにCPUでは数分かかるのがGPUなら数秒とかそれくらいの高速化が図れます。

こういう意味では、推論時にはご察しの通りデータ量は格段に少ないですし、計算量も少ないので「学習の時に短縮できたような莫大な時間の短縮」は図れません。こういう都合から、学習はサーバで行い、推論はエッジデバイス(スマホだったり、RasbperryPiだったり)というやり方が主流です。
なので、Q.推論時も学習時のような莫大な時間が節約できるか?の答えはNoになります。

実際問題、推論時にGPUはいらないか?

とはいえ、推論時にGPUはいらない?というとそうでもありません。
場合によるとは思いますが、推論時に「1秒かかってもいい」なのか、「一秒もかかっては困る」なのか、でだいぶ意味合いが変わってきます。一秒くらい大したことないという用途であれば(例えば)CPUで推論させても全く問題ないと思いますし、動画に対するリアルタイム画像認識であれば「一秒どころか0.1秒でも遅すぎる、0.0x秒でないと使い物にならない」であればGPUが望ましいです。

ですので、Q.推論時にGPUなしでも良い?の答えは、どこまでリアルタイム性が求められるか次第、になります。

工夫次第で何とかなる場合もある

姿勢認識のネットワークにOpenPoseというものがあり、これはGPUがないとカクカクしてしまうような処理でした。がGoogleが本気を出してMediapipeというものを公開しました。詳しいことは分かりませんが、精度にほとんど影響しないような計算は端折る、計算自体を最適化して短時間に済ませられるようにする等の最適化を図ったため、普通のノートPCやスマホでもサクサク動くようになっています。

買うのはちょっと…

既にご存じかもしれませんが、Google Colabを使うとGPU付きのサーバーを無料で使えるようになります。もちろんGPU無効のオプションもPython側で選べるので、どんなもんかな、とやってみるのはいかがでしょうか?

回答漏れの部分

一つのデータを入力して、前後順番に計算結果を継承して計算処理をして行かなければならないので、どの辺GPU有利でしょうか

ニューラルネットワークの図を描くと〇から線を引いた図がよく使われます。あの丸と線の一つ一つがax + bを表しています。これが何万何十万と連なっているのがニューラルネットワークです。推論時であっても簡単な計算(ax + b)がものすごく必要なためGPUはどうしても有利になります。GPUは簡単な計算(ax + b)を同時に数千個以上並べて計算できるシステムなためです。

投稿2022/06/11 07:42

編集2022/06/11 09:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/06/11 13:26

丁寧なご説明ありがとうございます。 NNの計算は実際matrix の掛け算や、tensor操作・計算の形で表現されるのでしょうか。 matrix 計算の並行性❓ tensor計算の並行性❓ に関わるのでしょうか。
退会済みユーザー

退会済みユーザー

2022/06/11 21:32 編集

> NNの計算は実際matrix の掛け算や、tensor操作・計算の形で表現 そうなります。 3Dのデータを表示するときに視点を変えた時にどう見えるか計算するのに射影変換(正方形→台形のようなイメージ)をするのですが、これがまさに行列の計算そのものです。これを巨大な画像(表示しようとしている画面)全体に対して早く捌く=並列処理する仕事を担うのがGPUです。なので、3Dデータを高速に捌けることと、行列の計算を高速に捌けることはよく似た処理と言えます。GPU屋に言わせれば、行列の計算以外にいろいろやっている、行列の計算だけじゃねーよ――と言われそうですが、少なくとも機械学習の面ではこういうことです。 ・ 一個一個ax + bをやっていくと、計算自体はすぐに終わっても計算自体の回数が多いから、いくら計算が早かったとしても遅くなるよね(=CPU) ・ どうせニューラルネットワーク全体で沢山ax +bをするんだから、行列の計算として落とし込めばまとめて計算できるから早いよね(=GPU)
insecticide

2022/06/15 12:54

分かりやすく本質的なご教授ありがとうございました ❣ 
guest

0

深層学習プログラミング体験編(犬種識別AI)
から引用して、ちょっと手を加えた下記コードで、google colabのCPU, GPUで、1枚の画像の「model.predict」の実行時間を測ってみました

python

1# Google Colabで実行の際に、下記のコードにて、このプログラムをTensorFlow バージョン1系で動作させるためのコマンドです。 2%tensorflow_version 1.x 3 4# TensorFlow バージョン2系で実行したい場合は下記のColab(URL)をご確認ください。 5# https://colab.research.google.com/notebooks/tensorflow_version.ipynb 6 7# 必要なモジュールをインポート 8from keras.applications.vgg16 import VGG16, decode_predictions,preprocess_input 9from keras.preprocessing import image 10from PIL import Image 11import numpy as np 12import urllib.request as urllib 13import time 14 15# 手元の環境で実行させたい場合は下記2つも読み込んでください。 16# import tensorflow 17# import keras 18 19 20""" 21filename: 判定したい画像ファイル 22size: 予測した結果を何件まで表示させたいか(初期値5件) 23""" 24def predict(filename, size=5): 25 # 画像ファイルとして保存 26 filename = urllib.urlretrieve(filename, "sample.png") 27 img = image.load_img(filename[0], target_size=(224, 224)) # 画像を読み込み 28 x = image.img_to_array(img) # 画像ファイルを数値に変換 29 x = np.expand_dims(x, axis=0) # 次元を増やす 30 31 ''' 32 事前学習済みのモデルを使う際にはpreprocess_input()という関数を呼び出して 33 画像に対して前処理を行う ことでより良い性能が出ますので、そのため以下のpreprocess_input()を使っています。 34 ''' 35 x = preprocess_input(x) # 一律に画像の正規化や平均値を引いている前処理 36 start = time.time() 37 pred = model.predict(x) 38 elapsed_time = time.time() - start 39 print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") 40 results = decode_predictions(pred, top=size)[0] # VGG16の1000クラスはdecode_predictions()で文字列に変換 41 return results 42 43# VGG16を使用 44model = VGG16(weights="imagenet") 45 46# 犬の判定処理 47filename = "https://aiacademy.jp/dataset/dog1.jpg" 48results = predict(filename, 10) 49for result in results: 50 print(result)

1回目の実行はモデルをダウンロードしたりいろいろやってるので、2回目の実行の時間です
[CPU] elapsed_time:0.7016515731811523[sec]
[GPU] elapsed_time:0.0678093433380127[sec]
何回か測定して平均したりはしてませんので、あまり正確な見積もりでは無いですが、この場合はGPUの方が10倍くらい速くなりました

使うAIによっても当然結果は変わりますし、google colabで割り当てられたGPUの機種によっても変わると思いますので、あくまでも参考程度に

投稿2022/06/15 01:11

編集2022/06/15 01:30
jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/06/15 01:40 編集

貴重な実験レポート本当にありがとうございます。 start = time.time() pred = model.predict(x) elapsed_time = time.time() - start 推論時間だけでも10倍の差があるのか、驚きました。 恐らくTensor計算、matrix操作は全部GPUの特長を生かしてうまく並列化されたんでしょうね。NVDIAはそういうライブラリーを提供しなければ、できる人はいないかも。
jbpb0

2022/06/15 08:28

pythonのAIに限らず、一般的なGPU演算の話です GPU演算の前後でCPU←→GPUのデータ転送が発生し、これがなかなか遅いのです https://www.gdep-sol.co.jp/gpu-programming1-no2 そのため、演算をGPUで並列化した時間短縮効果が、データ転送の時間増を上回らないと、CPUのみ演算よりもトータル時間が増えてしまいます https://tadaoyamaoka.hatenablog.com/entry/2016/06/11/222252 AIのCNNは並列化と相性がよく、GPU演算で効果が出やすいです LSTMはCNNよりも並列化が難しいので、こんなに効果が出ないかも https://recruit.gmo.jp/engineer/jisedai/blog/deep_learning_lstm_vs_qrnn/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問