ryo0606
@ryo0606

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Colabでのtensorboardの起動

解決したいこと

Google Colabでセル内でtensorboardを起動したいのですが出来ません

発生している問題・エラー

エラーのメッセージはなく、何かを表示しようとしたのか出力セルは大きくなっています
また画像にあるようにイベントファイルも出力されています
スクリーンショット 2024-04-01 12.35.03.png

該当するソースコード

from google.colab import drive
drive.mount('/content/drive')
!pip install gymnasium
!pip install tensorboardX
# Load the TensorBoard notebook extension
%load_ext tensorboard
import gymnasium as gym
from collections import namedtuple
import numpy as np
from tensorboardX import SummaryWriter

import torch
import torch.nn as nn
import torch.optim as optim


HIDDEN_SIZE = 128
BATCH_SIZE = 16
PERCENTILE = 70


class Net(nn.Module):
    def __init__(self, obs_size, hidden_size, n_actions):
        super(Net, self).__init__()
        self.net = nn.Sequential(
            nn.Linear(obs_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, n_actions)
        )

    def forward(self, x):
        return self.net(x)


Episode = namedtuple('Episode', field_names=['reward', 'steps'])
EpisodeStep = namedtuple('EpisodeStep', field_names=['observation', 'action'])


def iterate_batches(env, net, batch_size):
    batch = []
    episode_reward = 0.0
    episode_steps = []
    obs = env.reset()
    sm = nn.Softmax(dim=0)
    obs = obs[0]

    while True:
        obs_v = torch.FloatTensor(obs)
        act_probs_v = sm(net(obs_v))
        act_probs = act_probs_v.data.numpy()
        action = np.random.choice(len(act_probs), p=act_probs)
        next_obs, reward, terminated, truncated, _ = env.step(action)
        episode_reward += reward
        step = EpisodeStep(observation=obs, action=action)
        episode_steps.append(step)
        if terminated or truncated:
            e = Episode(reward=episode_reward, steps=episode_steps)
            batch.append(e)
            episode_reward = 0.0
            episode_steps = []
            next_obs = env.reset()
            if len(batch) == batch_size:
                yield batch
                batch = []

        if len(next_obs) == 2:
          next_obs = next_obs[0]
        obs = next_obs


def filter_batch(batch, percentile):
    rewards = list(map(lambda s: s.reward, batch))
    reward_bound = np.percentile(rewards, percentile)
    reward_mean = float(np.mean(rewards))

    train_obs = []
    train_act = []
    for reward, steps in batch:
        if reward < reward_bound:
            continue
        train_obs.extend(map(lambda step: step.observation, steps))
        train_act.extend(map(lambda step: step.action, steps))

    train_obs_v = torch.FloatTensor(train_obs)
    train_act_v = torch.LongTensor(train_act)
    return train_obs_v, train_act_v, reward_bound, reward_mean


if __name__ == "__main__":
    env = gym.make("CartPole-v0")
    # env = gym.wrappers.Monitor(env, directory="mon", force=True)
    obs_size = env.observation_space.shape[0]
    n_actions = env.action_space.n

    net = Net(obs_size, HIDDEN_SIZE, n_actions)
    objective = nn.CrossEntropyLoss()
    optimizer = optim.Adam(params=net.parameters(), lr=0.01)
    writer = SummaryWriter(comment="-cartpole")

    for iter_no, batch in enumerate(iterate_batches(
            env, net, BATCH_SIZE)):
        obs_v, acts_v, reward_b, reward_m = \
            filter_batch(batch, PERCENTILE)
        optimizer.zero_grad()
        action_scores_v = net(obs_v)
        loss_v = objective(action_scores_v, acts_v)
        loss_v.backward()
        optimizer.step()
        print("%d: loss=%.3f, reward_mean=%.1f, rw_bound=%.1f" % (
            iter_no, loss_v.item(), reward_m, reward_b))
        writer.add_scalar("loss", loss_v.item(), iter_no)
        writer.add_scalar("reward_bound", reward_b, iter_no)
        writer.add_scalar("reward_mean", reward_m, iter_no)
        if reward_m > 199:
            print("Solved!")
            break
    writer.close()
#TensorBoard起動(表示したいログディレクトリを指定)
%tensorboard --logdir=logs

一応全てのコードを載せます。cross-entropy methodを使ったcartpole環境での学習をしています。
バージョンなどは全てデフォルトです

自分で試したこと

ChatGPTさんに聞くとtensorboardはイベントファイルを元に起動するとのことだったので、Google driveをマウントしましたがダメでした。エラーが出ていないことやイベントファイルが作成されていることから、恐らくコードに問題はないと考えましたが、同じような事例が見つからず、解決できそうにないので教えていただきたいです。

0

1Answer

#TensorBoard起動(表示したいログディレクトリを指定)
%tensorboard --logdir=logs

詳しく知りませんが、logsに出力する必要があるのでは?

0Like

Comments

  1. @ryo0606

    Questioner

    コメントありがとうございます。以下のようにコードを変換し、"logs"に出力し、--logdir=logsとしましたが、同じような結果でした。

    writer = SummaryWriter("logs")
    

    またSummaryWriterに引数を指定しない場合、私の画像にあるようにデフォルトとしてrunsというディレクトリが作られるのですが、こちらだと中に別のディレクトリが出来ており、その中にイベントファイルが存在するという違いはありました。(引数に"logs"を指定している場合はlogsディレクトリの中にイベントファイルがある)

    (余談?)
    同じ方が執筆されている別の記事のコードをそのまま実行しても、tensorboardの出力部分は上手くいきませんでした。

  2. またSummaryWriterに引数を指定しない場合、私の画像にあるようにデフォルトとしてrunsというディレクトリが作られるのですが、こちらだと中に別のディレクトリが出来ており、その中にイベントファイルが存在するという違いはありました。

    自分が実行すると、--logdir=runsに変更してグラフが出てきました。

    scr2.png

    以下のコードです。

    !pip install gymnasium
    !pip install tensorboardX
    
    from __future__ import absolute_import, division, print_function, unicode_literals
    
    try:
      # %tensorflow_version only exists in Colab.
      %tensorflow_version 2.x
    except Exception:
      pass
    
    # Load the TensorBoard notebook extension
    %load_ext tensorboard
    
    import gymnasium as gym
    from collections import namedtuple
    import numpy as np
    from tensorboardX import SummaryWriter
    
    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    
    HIDDEN_SIZE = 128
    BATCH_SIZE = 16
    PERCENTILE = 70
    
    
    class Net(nn.Module):
        def __init__(self, obs_size, hidden_size, n_actions):
            super(Net, self).__init__()
            self.net = nn.Sequential(
                nn.Linear(obs_size, hidden_size),
                nn.ReLU(),
                nn.Linear(hidden_size, n_actions)
            )
    
        def forward(self, x):
            return self.net(x)
    
    
    Episode = namedtuple('Episode', field_names=['reward', 'steps'])
    EpisodeStep = namedtuple('EpisodeStep', field_names=['observation', 'action'])
    
    
    def iterate_batches(env, net, batch_size):
        batch = []
        episode_reward = 0.0
        episode_steps = []
        obs = env.reset()
        sm = nn.Softmax(dim=0)
        obs = obs[0]
    
        while True:
            obs_v = torch.FloatTensor(obs)
            act_probs_v = sm(net(obs_v))
            act_probs = act_probs_v.data.numpy()
            action = np.random.choice(len(act_probs), p=act_probs)
            next_obs, reward, terminated, truncated, _ = env.step(action)
            episode_reward += reward
            step = EpisodeStep(observation=obs, action=action)
            episode_steps.append(step)
            if terminated or truncated:
                e = Episode(reward=episode_reward, steps=episode_steps)
                batch.append(e)
                episode_reward = 0.0
                episode_steps = []
                next_obs = env.reset()
                if len(batch) == batch_size:
                    yield batch
                    batch = []
    
            if len(next_obs) == 2:
              next_obs = next_obs[0]
            obs = next_obs
    
    
    def filter_batch(batch, percentile):
        rewards = list(map(lambda s: s.reward, batch))
        reward_bound = np.percentile(rewards, percentile)
        reward_mean = float(np.mean(rewards))
    
        train_obs = []
        train_act = []
        for reward, steps in batch:
            if reward < reward_bound:
                continue
            train_obs.extend(map(lambda step: step.observation, steps))
            train_act.extend(map(lambda step: step.action, steps))
    
        train_obs_v = torch.FloatTensor(train_obs)
        train_act_v = torch.LongTensor(train_act)
        return train_obs_v, train_act_v, reward_bound, reward_mean
    
    
    if __name__ == "__main__":
        env = gym.make("CartPole-v0")
        # env = gym.wrappers.Monitor(env, directory="mon", force=True)
        obs_size = env.observation_space.shape[0]
        n_actions = env.action_space.n
    
        net = Net(obs_size, HIDDEN_SIZE, n_actions)
        objective = nn.CrossEntropyLoss()
        optimizer = optim.Adam(params=net.parameters(), lr=0.01)
        writer = SummaryWriter(comment="-cartpole")
    
        for iter_no, batch in enumerate(iterate_batches(
                env, net, BATCH_SIZE)):
            obs_v, acts_v, reward_b, reward_m = \
                filter_batch(batch, PERCENTILE)
            optimizer.zero_grad()
            action_scores_v = net(obs_v)
            loss_v = objective(action_scores_v, acts_v)
            loss_v.backward()
            optimizer.step()
            print("%d: loss=%.3f, reward_mean=%.1f, rw_bound=%.1f" % (
                iter_no, loss_v.item(), reward_m, reward_b))
            writer.add_scalar("loss", loss_v.item(), iter_no)
            writer.add_scalar("reward_bound", reward_b, iter_no)
            writer.add_scalar("reward_mean", reward_m, iter_no)
            if reward_m > 199:
                print("Solved!")
                break
        writer.close()
    
    #TensorBoard起動(表示したいログディレクトリを指定)
    %tensorboard --logdir runs
    

    runsの下のディレクトリは、実行単位?のようで、結果は、チェックマークが付いていると、縦にすべて表示されるようです。

  3. @ryo0606

    Questioner

    ご返信ありがとうございます。
    結果としては出来ませんでしたが、nak435様のスクリーンショットと私の画面を比べる限り、赤線部分が1番の違いであり、キーである部分かと思いました。
    どうやってそれを出すのでしょうか?
    スクリーンショット 2024-04-03 12.42.05.png

    68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3238333239332f32643865313936332d383764332d333334302d333261342d6335393337316433363166642e706e67.png

  4. 特に「出す」操作は何もしていません。逆に閉じ方も分かりません。
    この後、「ノートブックの新規作成」からの一連の操作のスクショを添付しますので、お待ちください。

  5. @ryo0606

    Questioner

    添付された画像を拝見し、コードや実行方法に問題はなく、環境に問題があると考えたため、Google Chromeをアップデートし、そこで実行したところ(ずっとsafariでやってました)tensorboardが出てきました!Google Chromeで実行するというのは先日も試してダメだったので、答えは「Google Chromeの更新」だったようです。ありがとうございました!

  6. 解決してよかったですね。

    自分は、Google xxx は、Safariだと動かないことやレイアウトが崩れることがあるため、すべて Chromeで動かしています。


    先ほどの回答で一部訂正です。

    runsの下のディレクトリは、実行単位?のようで、結果は、チェックマークが付いていると、縦にすべて表示されるようです。

    チェックマークが付いている結果が、同じグラフに色違いで表示されました。

  7. @ryo0606

    Questioner

    Chromeでの実行、更新はColab愛用者として改めて意識する必要があるなと思いました。
    この度はありがとうございました。

Your answer might help someone💌