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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Q&A

解決済

1回答

2172閲覧

pytorch gpuのメモリを無茶苦茶侵食します

Flan.

総合スコア123

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

0グッド

0クリップ

投稿2020/06/10 21:59

編集2020/06/10 22:06

試しに原因と思われる部分を切り出して乱数を突っ込んだんですが
メモリが侵食されてるのでこのコードに原因があると思います
一番でかいデータは 4004003のやつだと思うのですが
to(cuda)でGPUにいれるのはforward内です 
毎回x=input.to()で動かしてるため xは上書きされ容量がグワッと
増えることはないはずです 

予想している原因
pytorchは勾配データ(?)をためてるとか そのせいでメモリが増えた?
私がto()の使い方を間違ってる
普通xは上書きされると思うのですが実はされていない

追記<next_state をis_cudaしてみた結果 Falseですどうやら
forward内が原因っぽそう>

原因がわかる人教えてください 
(to()はこういう物 Tensor型はこういう性質がある など)

タスクマネージャー&動かした結果

コード全体 文字数関係で一部省略

Noisy_netはNoisy_net(どっかからとってきた どこからかは忘れた) swishは活性化関数 init_weights は初期化 class QNetwork(nn.Module): def __init__(self, num_inputs, num_outputs): super(QNetwork, self).__init__() self.LSTMs=[] self.net_type="noisy" self.hidden_size=25*25#NAF用 最後の層 nn.ZeroPad2d(1) self.hidden_CNN=256*25*25 self.hidden_size1=25*25 self.hidden_size2=None self.cnn1 = nn.Sequential( nn.Conv2d(3, 16, kernel_size=(3,3), padding=1), swish(0.7), nn.Conv2d(16, 16, kernel_size=(3,3), padding=1), nn.MaxPool2d(kernel_size=(2,2), stride=(2,2)),        ..... nn.Conv2d(256, 256, kernel_size=(3,3), padding=1), swish(0.7), nn.MaxPool2d(kernel_size=(2,2), stride=(2,2))) self.cnn1.apply(init_weights) self.free_net= nn.Sequential( nn.Linear(self.hidden_size1, self.hidden_size1), swish(0.7),       .... ) self.free_net.apply(init_weights) NAFと出力レイヤー用 self.a = nn.Linear(self.hidden_size, self.hidden_size) self.swish=swish(0.7) init_weights(self.a) if self.net_type=="noisy": self.V_q = Noisy_net(self.hidden_size, 1)# V_q self.V = Noisy_net(self.hidden_size, 1)# V self.mu = Noisy_net(self.hidden_size, num_outputs)# mu else: self.V_q = nn.Linear(self.hidden_size, 1)# V_q self.V = nn.Linear(self.hidden_size, 1)# V self.mu = nn.Linear(self.hidden_size, num_outputs)# mu self.L = nn.Linear(self.hidden_size, num_outputs ** 2) init_weights(self.V) init_weights(self.V_q) init_weights(self.mu) init_weights(self.L) self.L_mask=torch.diag(torch.diag(torch.ones(num_outputs,num_outputs))).unsqueeze(0).to("cuda:0") def forward(self,inputs,net): if net=="net_q": x, u = inputs u=u.to('cuda:0') x=x.to("cuda:0") else: x = inputs.to('cuda:0') #------------------------------------ x=self.cnn1(x) x=x.contiguous().view(-1, 1).T x=self.free_net(x) #---------------------------------- x=self.swish(self.a(x)) if net=="net_v": V=self.V(x)-self.V_q(x) return V if net=="net_a": mu =self.mu(x) return mu.to("cpu") if net=="net_q": mu =self.mu(x)        NAFという手法を実装 検証したがこれが原因ではなさそう return Q def Re_start(self,hiddens=None): self.V.reset_parameters() self.V_q.reset_parameters() self.mu.reset_parameters() if hiddens == None: self.LSTMs.data.fill_(0) else: self.LSTMs=hiddens[0] class Memory: def __init__(self, max_size=1000): self.buffer = deque(maxlen=max_size) def add(self, experience): self.buffer.append(experience) def sapp(self, batch_size): idx = np.random.choice(np.arange(len(self.buffer)), size=batch_size, replace=False) return idx class Memory_TDerror(Memory):# Memoryクラスを継承 TD誤差格納クラス def __init__(self, max_size=1000,): super().__init__(max_size) # TD誤差をすべて更新 def update_TDerror(self,gamma,multireward_steps): for i in range(multireward_steps, (len(memory.buffer))): inpp=[memory.buffer[i-multireward_steps][0],memory.buffer[i-multireward_steps][1]] next_state=memory.buffer[i][0] reward=memory.buffer[i][2] target = reward.to("cuda:0") + (gamma**multireward_steps) * targetQN.forward(next_state,"net_v")[0] TD=target - mainQN.forward(inpp,"net_q")[0] self.buffer.append(TD.to("cpu",torch.float32)) print(TD) def mask_input(x):# データの前処理 to("cuda")は入れなくていい if type(x)==np.ndarray: x = torch.from_numpy(x) x=x.permute(0 ,3, 1, 2) return x def Q_e(epsilon,next_state,action_size): if epsilon <= np.random.uniform(0, 1): action = targetQN.forward(next_state,"net_a") else: action = torch.randn(1,action_size).half() return action #ハイパーパラメータ-------------------------------------------------------- # ==レイヤー== Noisy_net #            == 関数 == mish() swish() num_episodes = 10 # 総試行回数 max_number_of_steps = 500 # 1試行のstep数 goal_average_reward = 100 # この報酬を超えると学習終了 num_consecutive_iterations = 10# 学習完了評価の平均計算を行う試行回数 gamma = 0.99 # 割引係数 islearned = 0 # 学習が終わったフラグ isrender = 0 # 描画フラグ learning_rate = 0.001 # Q-networkの学習係数 memory_size = 10000 # バッファーメモリの大きさ batch_size = 32 # Q-networkを更新するバッチ multireward_steps=2 # マルチステップ rank_baes = 0.5# ランクベース beta_initial=0.0# 重要度サンプリング初期値 beta_steps=10000# 重要度サンプリング終了ステップ enable_is=True# 重要度サンプリングを使用するか Q_ebeir= True# Qーgraay bool値 action_size=2 # モデルのoutput state=np.zeros((400,400,3))# モデルのinput def mask_input(x):# データの前処理 to("cuda")は入れなくていい if type(x)==np.ndarray: x = torch.from_numpy(x) x=x.permute(0 ,3, 1, 2) return x #前処理------------------------------------------------------- #Qネットワークとメモリ、Actorの生成-------------------------------------------------------- mainQN = QNetwork(state.shape,action_size).to('cuda:0') optimizer = optim.Adam(mainQN.parameters(), lr=learning_rate) mainQN, optimizer = amp.initialize(mainQN, optimizer, opt_level="O1")#-------------- criterion = nn.MSELoss() targetQN = mainQN targetQN.eval() mainQN.eval() """ trin=trin(rank_baes=rank_baes, beta_initial=beta_initial, beta_steps=beta_steps, enable_is=enable_is, multireward_steps=multireward_steps) """ total_reward_vec = np.zeros(num_consecutive_iterations) memory = Memory(max_size=memory_size) memory_TDerror = Memory_TDerror(max_size=memory_size) acthon=np.array([np.zeros(action_size)]) state_=np.array([state]) #ここからぐわっとメモリ侵食 print("start") for _ in range(30): next_state=mask_input(np.random.rand(1,400,400,3)) action=mainQN.forward(next_state,"net_a") reward=1 memory.add((next_state, action, reward)) # メモリの更新する print("ok")

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

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

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

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

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

guest

回答1

0

自己解決

targetsがnumypだった

投稿2020/06/13 17:50

Flan.

総合スコア123

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問