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

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

ただいまの
回答率

89.69%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 654

no.28

score 4

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/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 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にしてやってみたいと思います。

    キャンセル

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

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