試しに原因と思われる部分を切り出して乱数を突っ込んだんですが
メモリが侵食されてるのでこのコードに原因があると思います
一番でかいデータは 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")
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。