🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

876閲覧

tensorflowを利用するGPUクラウドサーバの利用方法について

yamayamak

総合スコア131

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2019/12/22 02:27

tensorflowを動かすGPUクラウドサーバ性能について質問させて頂きます。
AWSのGPUインスタンスを利用して性能を見ていますが、GPUコア数の高いインスタンスを利用しても処理時間が上がりません。
なぜ、インスタンスでGPU数を多くしても処理速度に変化がないのか理解できていませんが、一つのGPUしか利用できていないかとも考えています。
利用方法についてご意見、アドバイスなども含めてご教授ください。

●AWS-g4dn.2xlarge
1 2019-12-21 21:20:45.724076
1 0 2019-12-21 21:20:45.725365
1 1000 2019-12-21 21:22:10.905428
1 2000 2019-12-21 21:27:49.926334
1 3000 2019-12-21 21:37:48.248926【17分】

●AWS-g4dn.8xlarge
1 2019-12-21 23:23:20.350477
1 0 2019-12-21 23:23:20.351867
1 1000 2019-12-21 23:24:44.001723
1 2000 2019-12-21 23:30:19.057467
1 3000 2019-12-21 23:40:09.601611【17分】

●AWS-p2.xlarge
1 2019-12-21 22:02:09.613107
1 0 2019-12-21 22:02:09.615015
1 1000 2019-12-21 22:03:37.300308
1 2000 2019-12-21 22:09:24.594682
1 3000 2019-12-21 22:19:36.657834【17分】

●プログラムについて
プログラムは以下のような物をJupiterNotebookで動かしています。

Python

1# -*- coding: utf-8 -*- 2import math 3import numpy as np 4import datetime 5import keras 6from keras.models import Sequential 7from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D 8import matplotlib.pyplot as plt 9 10# 過去半日分の履歴で計算 (1分足データなので、60*12 = 720/半日) 11#n = 1 * 60 * 3 12n = 160 #16の10倍 13 14# keras用のパラメータ 15batch_size = 5000 # 1000データ単位に学習 16epochs = 3 17# 0:温度以上, 1:温度以上変動なし, 2:温度以下の3クラス 18n_classes = 3 19# 何分までに 20inMinG = 15 21 22datafile = '../jupyter_files/xdata/srcCreate.txt' 23testfile = '../jupyter_files/xdata/tstCreate.txt' 24savefile = '../jupyter_files/x_ai.hdf5' 25 26class xDataGenerator(object): 27 def __init__(self, datafile, l_n): 28 self.l_n = l_n 29 self.reset() 30 # データ[温度,湿度,照度,臭度]の4値分足データのCSV形式 31 # 上記4値の3部屋分のデータ、+ 4個の[建物,曜日,月日,時分] = 16項目 を2時間40分[n=160] 32 # 常に最新160個のデータを保存 33 self.xparam = np.zeros(l_n*4*4) 34 # LabelEncode(classをint型に変換)するためのdict 35 with open(datafile) as f: 36 self.srcd = f.readlines() 37 38 def reset(self): 39 self.xdatas = np.empty((0, 1, self.l_n, 4*4), int) 40 self.ylabels = np.array([], int) 41 42 def flow_from_datafile(self, batch_size, datalen): 43 ###### 44 # 何分までに 45 inMin = 15 46 # 期待温度 47 goodVal = 100 48 # 反対温度 49 badVal = 50 50 51 while True: 52 # 読み込んだファイルの行数 53 for i in range( ( datalen - inMin ) ): 54 # 末尾に新しいデータをいれる(160行の最新データにする) 55 self.srcd[i] = self.srcd[i].strip() 56 spltDataArr = self.srcd[i].split(",") 57 if(len(spltDataArr) != 16): 58 continue 59 self.xparam = np.append(self.xparam[16:], spltDataArr) 60 61 # l_n個以上になるとAIに学習させる(720個分で学習させる) 62 if ( i >= self.l_n ): 63 64 # inMin分以内にlosscut(pips)以内にhopeVal(pips)が取れるか判定(クラス分) 65 curClass = 1 # 初期値は中間 66 curVal = 0 67 maxVal = 0 68 minVal = 0 69 for j in range( i, (i + inMin) ): 70 spltCheckArr = self.srcd[j].split(",") 71 if (j == i): 72 curVal = int(spltCheckArr[7]) 73 maxVal = int(spltCheckArr[5]) 74 minVal = int(spltCheckArr[6]) 75 lastRate = int(spltCheckArr[7]) 76 else: 77 lastRate = int(spltCheckArr[7]) 78 if ( maxVal < int(spltCheckArr[5]) ): 79 maxVal = int(spltCheckArr[5]) 80 if ( minVal > int(spltCheckArr[6]) ): 81 minVal = int(spltCheckArr[6]) 82 83 # クラス判定 最終値が期待温度を上下で超えているか(反対向けは単体温度以内)で判定 84 if ( (lastRate - curVal) > goodVal ): 85 if ( (curVal - minVal) < badVal ): 86 curClass = 0 87 elif ( (curVal - lastRate) > goodVal ): 88 if ( (maxVal - curVal) < badVal ): 89 curClass = 2 90 91 # 学習用データの格納 92 self.xdatas = np.append(self.xdatas, self.xparam.reshape(1, 1, self.l_n, 4*4), axis=0) 93 self.ylabels = np.append(self.ylabels, curClass) 94 95 # batch_sizeに達すれば一度学習する 96 if ( len(self.ylabels) == batch_size or i == (datalen - inMin - 1) ): 97 print ("") 98 print (i,(datalen - inMin - 1),len(self.ylabels),datalen,"shape0:",self.xparam.shape[0], 99 self.xdatas.shape[0],self.xdatas.shape[1],self.xdatas.shape[2],self.xdatas.shape[3]) 100 # 現在の日付と日時 101 nowdate = datetime.datetime.now() 102 print(":::", len(self.ylabels), nowdate) 103 # ターゲットyをkeras用の形式に変換 104 #y_keras = keras.utils.to_categorical(self.ylabels, 3) 105 y_keras = np.asarray(keras.utils.to_categorical(self.ylabels, 3)) 106 # データ返答 107 #yield self.xdatas, self.ylabels 108 inputs = np.asarray(self.xdatas) 109 #targets = np.asarray(self.ylabels) 110 self.reset() 111 yield inputs, y_keras 112 113 114# 現在の日付と日時 115nowdate = datetime.datetime.now() 116print(1, nowdate) 117 118# データXをCNN用の形式に変換 (X.shape[0]はデータ[行]数) 119#X = X.reshape(X.shape[0], n,4,4) #既にこの形で入力しているのでreshape不要 120#input_shape = (n,4,4) 121input_shape = (1,n,4*4) 122#input_shape = (n,16) 123 124# 畳み込みニューラルネットワークを定義 125model = Sequential() 126model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=input_shape)) 127model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu')) 128model.add(MaxPooling2D(pool_size=(2, 2))) 129model.add(Dropout(0.25)) 130model.add(Flatten()) 131model.add(Dense(units=128, activation='relu')) 132model.add(Dropout(0.5)) 133model.add(Dense(units=n_classes, activation='softmax')) 134 135# モデルのコンパイル 136model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) 137 138train_datagen = xDataGenerator(datafile,n) 139srcdlen = len(open(datafile).readlines()) 140test_datagen = xDataGenerator(testfile,n) 141tstdlen = len(open(testfile).readlines()) 142 143# steps_per_epochはその名のとおり、1epochのstep数で、基本はデータ数 / バッチサイズ = int(srcdlen / batchsize) 144history = model.fit_generator( 145 generator=train_datagen.flow_from_datafile(batch_size, srcdlen), 146 steps_per_epoch=int(np.ceil(srcdlen / batch_size)), 147 #steps_per_epoch=int(np.floor(srcdlen / batch_size)), 148 epochs=epochs, 149 verbose=1) 150 #validation_data=test_datagen.flow_from_datafile(batch_size, tstdlen), 151 #validation_steps=int(np.ceil(tstdlen / batch_size))) 152 153 154# 学習結果を保存 155model.save(savefile) 156 157#現在の日付と日時 158nowdate = datetime.datetime.now() 159print(3, nowdate) 160 161# 損失関数のグラフの軸ラベルを設定 162plt.xlabel('time step') 163plt.ylabel('loss') 164 165# グラフ縦軸の範囲を0以上と定める 166plt.ylim(0, max(np.r_[history.history['val_loss'], history.history['loss']])) 167 168# 損失関数の時間変化を描画 169val_loss, = plt.plot(history.history['val_loss'], c='#56B4E9') 170loss, = plt.plot(history.history['loss'], c='#E69F00') 171 172# グラフの凡例(はんれい)を追加 173plt.legend([loss, val_loss], ['loss', 'val_loss']) 174 175# 描画したグラフを表示 176plt.show()

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスタンスでGPU数を多くしても処理速度に変化がないのか理解できていませんが、一つのGPUしか利用できていないかとも考えています。

複数の GPU を利用する場合は、複数の GPU を利用するためのコードを書く必要があります。
DNN の分散学習の方法としてはモデルパラレルとデータパラレルがあります。
とくにそのようなコードを書いてない場合は GPU が複数認識されていたとしても、GPU1枚での学習になります。

分散学習のあれこれ~データパラレルからモデルパラレルまで~

TensorFlow ではやったことがないですが、データパラレルならかんたんにやるような仕組みが用意されているのではないでしょうか

投稿2019/12/22 04:51

編集2019/12/22 04:52
tiitoi

総合スコア21956

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

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

yamayamak

2019/12/22 09:21

ありがとうございます。 複数GPUを利用するようにプログラム修正が必要なのがわかったので調査してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問