メモリ使用の確認は タスクマネージャー
for _ in range(30): next_state=mask_input(np.random.rand(1,400,400,3)) action=mainQN.forward(next_state,"net_a") reward=1 print(action.is_cuda,next_state.is_cuda)
推論 画像をいれてモデルを動かす 関係ない部分を消すためrandnを使ってる
is_cudaの結果は当然false
mask_inputは型を変換to(cuda)は使用してないためこれが原因のはずはない
こっち単体で動かしても まったくメモリは侵食されません
memory.add((next_state, action, reward)) # メモリの更新する
インプットとアウトプットを保存する
これ単体で動かしても まったくメモリは侵食されません
、
for _ in range(30): next_state=mask_input(np.random.rand(1,400,400,3)) action=mainQN.forward(next_state,"net_a") reward=1 print(action.is_cuda,next_state.is_cuda) memory.add((next_state, action, reward)) # メモリの更新する
ですがなぜか上の二つを組み合わせると10gbのgpuメモリが半分以上侵食されます
単体に原因があるならわかるのですが
なぜ組み合わせたらおかしなことになるのですか?is_cudaの結果はもちろんfalse
もしかしてだが pytorchは計算結果すべて保存してる?
でもそうならmemory.addと組みあせなくてもメモリが悲惨なことになるはず
原因がわかりません わかる人教えてください
コード全体 関係ないとこは省略
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)), cnn15層 swish(0.7), 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_CNN, self.hidden_size1), swish(0.7), nn.Linear(self.hidden_size1, self.hidden_size1), swish(0.7), nn.Linear(self.hidden_size1, self.hidden_size1), swish(0.7), ) self.free_net.apply(init_weights) 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) 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") 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() 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]) #mainQN.sample_noise 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 print(action.is_cuda,next_state.is_cuda) memory.add((next_state, action, reward)) # メモリの更新する
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/29 15:10