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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Python

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

Q&A

2回答

1670閲覧

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

no.28

総合スコア10

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Python

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

0グッド

1クリップ

投稿2019/02/21 13:15

編集2019/02/21 14:25

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を高速化に生かすことは、難しいのでしょうか?

Python

1Keras: net model 2model = Sequential() 3model.add(Dense(64, input_dim=input_features, activation='relu')) 4model.add(BatchNormalization()) 5model.add(Dense(128, activation='relu')) 6model.add(BatchNormalization()) 7model.add(Dense(128, activation='relu')) 8model.add(BatchNormalization()) 9model.add(Dense(128, activation='relu')) 10model.add(BatchNormalization()) 11model.add(Dense(128, activation='relu')) 12model.add(BatchNormalization()) 13model.add(Dense(64, input_dim=input_features, activation='relu')) 14model.add(BatchNormalization()) 15model.add(Dense(1, activation='linear')) 16model.compile(loss='mae', optimizer='adam') 17

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

EDIT2:Cpu
イメージ説明

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

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

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

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

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

tiitoi

2019/02/21 13:20

お使いのハードウェアはなんでしょうか?
no.28

2019/02/21 13:24

追記いたしました。
Q71

2019/02/22 05:19

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

2019/02/22 06:57

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

回答2

0

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

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

投稿2019/02/21 14:58

hayataka2049

総合スコア30933

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

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

no.28

2019/02/21 15:29

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

2019/02/21 15:37

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

2019/02/21 15:46

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

2019/02/21 16:09 編集

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

2019/02/21 16:14

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

2019/02/21 16:18 編集

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

2019/02/21 16:23

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

0

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

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

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

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

検証したコード

python

1import pandas as pd 2df = pd.read_csv('data.csv') 3 4from keras.models import Sequential 5from keras.layers import Dense, BatchNormalization 6from sklearn.model_selection import train_test_split 7 8# データ分割 9x_train, x_test, y_train, y_test = train_test_split( 10 df.values[:, :4], df.values[:, 4], test_size=0.2) 11 12# モデル作成 13model = Sequential() 14model.add(Dense(64, input_dim=4, activation='relu')) 15model.add(BatchNormalization()) 16model.add(Dense(128, activation='relu')) 17model.add(BatchNormalization()) 18model.add(Dense(128, activation='relu')) 19model.add(BatchNormalization()) 20model.add(Dense(128, activation='relu')) 21model.add(BatchNormalization()) 22model.add(Dense(128, activation='relu')) 23model.add(BatchNormalization()) 24model.add(Dense(64, activation='relu')) 25model.add(BatchNormalization()) 26model.add(Dense(1, activation='linear')) 27model.compile(loss='mae', optimizer='adam') 28 29# 学習 30history = model.fit( 31 x_train, y_train, batch_size=128, epochs=1000, validation_split=0.1, verbose=0) 32 33# 結果 34score = model.evaluate(x_test, y_test) 35print(score) # 3.905887901720707 36 37import seaborn as sns 38sns.set() 39# 目的変数の分布 40sns.boxplot(x='PE', data=df)

イメージ説明

投稿2019/02/21 14:03

編集2019/02/21 16:12
tiitoi

総合スコア21956

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

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

no.28

2019/02/21 14:23

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

2019/02/21 14:39 編集

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

2019/02/21 15:38

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

2019/02/21 16:04

ご提示のデータセット、モデルを使い、GTX 1080 で batchsize=128 で1000エポックの学習時間を計測したところ、4分52秒かかりましたので、だいたい質問者さんと同じ時間になりました。 なので、これぐらいが限界なのではないでしょうか? ちなみにバッチサイズは計算時間に大きく影響します。 バッチサイズが小さいと、GPU にデータの転送がより発生するので遅くなります。 一方、バッチサイズを大きくしすぎるとまた精度が悪くなる可能性もあるので、いくつか試して良さそうな値を選ぶといいでしょう。
tiitoi

2019/02/21 16:16 編集

結論としては、この規模モデルでは GPU の計算時間に比べて GPU へのデータ転送の時間がボトルネックになってくるので、バッチサイズ大きくして減らすとかしないと削りようがなく、これ以上の時間の短縮は難しいのではないでしょうか? あとは他のライブラリ Caffe、PyTorch、Chainer などと比べてみるとか (ライブラリによってベンチマーク結果に差が出ると聞きます)
no.28

2019/02/21 16:16

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

2019/02/21 16:21

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

2019/02/21 16:24

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

2019/02/21 16:26

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

2019/02/21 17:03

DLで画像処理が多いのは最も成果が出ている分野の1つだからですね。 それに画像を入力する CNN は演算量もかなり必要なので GPU がよく活用できます。例えば入力が (256, 256, 3) なら 196608 次元ですから、今回の1万データ全部よりサンプル1つのほうがデータ量が多いことになります。 一般に「GPU のほうが CPU より早い、ただし、それは GPU をフル活用できるような演算を行うときに限る」ということになります。 回帰をDLでやる例は確かに少ないです。というのも今回のような問題にDLを持ち出すのはオーバースペックというか既存手法のほうがお手軽で精度も出るので、DLを使うこと自体を目的としないならDLを使う必要がないからですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問