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

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

ただいまの
回答率

90.51%

  • Python

    11683questions

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

  • TensorFlow

    919questions

  • Keras

    472questions

  • CPU

    52questions

ディープラーニング:回帰問題とハードウェア

受付中

回答 2

投稿 編集

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

no.28

score 0

4つの説明変数による、一つの目的変数をシンプルなニューラルネットワークによって回帰モデルを生成しようとしています。
Datasetは、Combined Cycle Power Plant Data Set
https://archive.ics.uci.edu/ml/datasets/combined+cycle+power+plant
10000 datapoint
を利用し、試しています。

tensor-gpuを使用していますが、CPUとGPUの使用度が20-30パーセント程度で推移し、
CPUは14コアが平均的に使用されています。

このような回帰問題において、多くのコアを持つCPUやGPUを高速化に生かすことは、難しいのでしょうか?

Keras: net model
model = Sequential()
model.add(Dense(64, input_dim=input_features, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(64, input_dim=input_features, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation='linear'))
model.compile(loss='mae', optimizer='adam')


EDIT1:Hardware info
CPU:i9-9940X
GPU:NVIDIA GeForce RTX2080
Memory:32 GB
OS:Windows

EDIT2:Cpu
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Q71

    2019/02/22 14:19

    GPU、CPUの使用率「だけ」で高速化できないかと検討することが間違いです。キチンと「何に」時間がかかっているか、計測してください(tiitoi さんが「ボトルネック」と言われているもの)。
    私の例で、tensor core を使ってもほとんど学習時間が変わらず、よくよく調べると
    ・SSDと思っていた記憶装置がHDDだった
    ・そのための転送時間が大半
    ・CNN部分が少なくてほとんど使われていない
    状態でした。

    キャンセル

  • no.28

    2019/02/22 15:57

    ボトルネックの計算箇所を、どう判断するのでしょうか?
    ハードウェアに関しては、SSDしか接続されていなく問題ないと思います。

    キャンセル

  • Q71

    2019/02/22 21:09

    https://developer.nvidia.com/cuda-toolkit
    この辺にプロファイラがあります。それで分析してください。

    キャンセル

回答 2

+1

CPUとGPUの使用度が20-30パーセント程度で推移し、CPUは14コアが平均的に使用されています。

質問欄のモデルは、パラメータ数が7万ぐらいなので昨今の Deep Learning のモデルに比べるとパラメータ数がかなり少ないので、計算量も少なくてすみます。
そのため、GPU の使用率も100%にならないのではないでしょうか。
例えば、CNN のモデルである VGG16 のパラメータ数は 138,357,544 あります。

では、パラメータを増やせばいいのかというと、それはタスクに依存します。
今回の「4つの説明変数による、一つの目的変数」というタスクであれば、それでも十分なパラメータがあると考えられます。
過剰に増やしすぎると、過学習の原因になります。

またマルチコアの CPU や GPU が2台以上ある場合、それらを有向に活用できるようなコードを意図して書かない限り (CPU であれば、マルチスレッドのプログラム)、シングルコアで動作するのでハードウェアの恩恵は受けられません。

検証したコード

import pandas as pd
df = pd.read_csv('data.csv')

from keras.models import Sequential
from keras.layers import Dense, BatchNormalization
from sklearn.model_selection import train_test_split

# データ分割
x_train, x_test, y_train, y_test = train_test_split(
    df.values[:, :4], df.values[:, 4], test_size=0.2)

# モデル作成
model = Sequential()
model.add(Dense(64, input_dim=4, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation='linear'))
model.compile(loss='mae', optimizer='adam')

# 学習
history = model.fit(
    x_train, y_train, batch_size=128, epochs=1000, validation_split=0.1, verbose=0)

# 結果
score = model.evaluate(x_test, y_test)
print(score)  # 3.905887901720707

import seaborn as sns
sns.set()
# 目的変数の分布
sns.boxplot(x='PE', data=df)

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/21 23:23

    本来の目的のため、このようなニューラルネットを高速化し、回転率を上げていきたいのですが、すべてのCPU,GPUは少なくとも使用されている状態で、ここから速度を改善しようとするとどのような対策が考えられますか?

    キャンセル

  • 2019/02/21 23:38 編集

    まず Deep Learning の演算は基本的に GPU で行われるので、CPU はあまり使われないでしょう。
    次に GPU ですが、より大規模のモデルで学習等実行すれば、特別なことは何もしなくとも、100% 近くまで使われるようになると思います。
    今 GPU があまり使用されていないのは問題が簡単だからです。

    キャンセル

  • 2019/02/22 00:38

    ネットワークとしては簡素なのですが、収束するまでに、1000epochs程度で、5分程度かかります。CNNのGPU利用は多くあるのですが、GPUをうまく利用できないかと考えていました。

    キャンセル

  • 2019/02/22 01:04

    ご提示のデータセット、モデルを使い、GTX 1080 で batchsize=128 で1000エポックの学習時間を計測したところ、4分52秒かかりましたので、だいたい質問者さんと同じ時間になりました。
    なので、これぐらいが限界なのではないでしょうか?

    ちなみにバッチサイズは計算時間に大きく影響します。
    バッチサイズが小さいと、GPU にデータの転送がより発生するので遅くなります。
    一方、バッチサイズを大きくしすぎるとまた精度が悪くなる可能性もあるので、いくつか試して良さそうな値を選ぶといいでしょう。

    キャンセル

  • 2019/02/22 01:15 編集

    結論としては、この規模モデルでは GPU の計算時間に比べて GPU へのデータ転送の時間がボトルネックになってくるので、バッチサイズ大きくして減らすとかしないと削りようがなく、これ以上の時間の短縮は難しいのではないでしょうか?

    あとは他のライブラリ Caffe、PyTorch、Chainer などと比べてみるとか (ライブラリによってベンチマーク結果に差が出ると聞きます)

    キャンセル

  • 2019/02/22 01:16

    わざわざ試していただいてありがとうございました。
    このあたりで限界で、あまりGPUなどを使っても速さに影響しないようなので、別の方法を考えたいと思います。

    キャンセル

  • 2019/02/22 01:21

    今回の問題の例だとGPUの計算時間に比べて、データ転送の時間がボトルネックになっており短縮できないだけで、よりGPUの計算リソースをフルに活用できる大規模なモデルであれば、CPU に比べてGPUのほうが圧倒的に早いと思いますよ。
    実際、CNN のモデル等で学習したときは、CPUに比べてGPUのほうが30倍ぐらいは早かったです。

    キャンセル

  • 2019/02/22 01:24

    今試しに SVM で試したら学習が一瞬で終わって、精度もDNNよりよかったので、こういう類のは Deep Learning でなく、sklearn にある手法とかでやったほうが CPU も活用できてよいでしょうね。

    キャンセル

  • 2019/02/22 01:26

    DeeplearningとGPUといえば、すべてが高速化するイメージになっていたましたが、ほぼすべての例がCNNなどによる画像処理なので、自分は画像を扱わなく、例もなかなか見当たらなかったので環境を用意してみました。

    キャンセル

  • 2019/02/22 02:03

    DLで画像処理が多いのは最も成果が出ている分野の1つだからですね。
    それに画像を入力する CNN は演算量もかなり必要なので GPU がよく活用できます。例えば入力が (256, 256, 3) なら 196608 次元ですから、今回の1万データ全部よりサンプル1つのほうがデータ量が多いことになります。

    一般に「GPU のほうが CPU より早い、ただし、それは GPU をフル活用できるような演算を行うときに限る」ということになります。

    回帰をDLでやる例は確かに少ないです。というのも今回のような問題にDLを持ち出すのはオーバースペックというか既存手法のほうがお手軽で精度も出るので、DLを使うこと自体を目的としないならDLを使う必要がないからですね。

    キャンセル

+1

問題の規模と比較してマシンも(まあこれはともかく)使っているモデルもオーバースペックすぎる、というのが率直な感想です。

それこそ多項式回帰でもやれば十分なタスクだと思うのですが・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/22 00:29

    今回は、サンプルのデータで、これくらいのディープラーニングの回帰問題を高速化できるというトライアルです。これでもデータ数が10000あり、学習率を調整すると学習に時間がかかってしまうので、それをこれらのCPUやGPUをつかって高速化できないのかと考えです。

    キャンセル

  • 2019/02/22 00:37

    このモデルを使うという制約があるのなら、fitさせるときのパラメータで調整するしかないので、どんな設定にしているのか書いてください

    キャンセル

  • 2019/02/22 00:46

    Batch_sizeや、epochsは、安定、収束するまで繰り返し最適化するようになっているので、Batchを上げたりして早くするというよりは、この余裕のあるCPUとGPUの性能を生かして、早く演算したいという発想です。この14コアのCPUとGPUが20%くらいで演算する速さと、i7-9700Kが100%で演算した時の速さが変わらない状態です。

    キャンセル

  • 2019/02/22 00:54 編集

    もちろんまだ計算リソースに余裕がある可能性もありますが、行う計算が単純なので相対的にそれ以外の通信・同期などに要するオーバーヘッドが大きく見えている可能性も相応に高いです。後者だった場合はこれで限界なので、データの送り込み方を変えてレイテンシの遮蔽や、オーバーヘッドの相対的な削減を試みるくらいしか手が残っていません。そういう意味では、バッチ周りでチューニングするのは、性能へのインパクトがなければ有効な手立てだと思います。

    キャンセル

  • 2019/02/22 01:14

    自分としても、そのような通信の可能性を含めた問題でこのコア数を増やすという方法やGPUを使うという方向では早くできないように感じています。

    キャンセル

  • 2019/02/22 01:18 編集

    そうですね、並列化にも限界があります。
    ところで、9700Kなら100%にできてだいたい14コアのCPUとGPUが20%くらいで演算する速さになるなら、いっそGPUを無効化してCPUだけで回せばその1.5倍速くらいにはなりませんか?

    キャンセル

  • 2019/02/22 01:23

    その発想はありませんでした。 非GPU環境のtensorにしてやってみたいと思います。

    キャンセル

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

  • Python

    11683questions

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

  • TensorFlow

    919questions

  • Keras

    472questions

  • CPU

    52questions