Weights & Biases使用指南

Weights & Biases 简单来说就是进阶版的tensorboard,功能更加强大,如果要详细说它跟tensorboard有什么不同,参考官网的这一段解释。附图如下:

compare

我个人比较看中的是W&B能够帮助我记录实验的参数(甚至详细到git commit,防止自己又跑错了实验==),并且具有group功能,直接画出RL需要的均值方差图。另外第4点和第5点也是促使我使用它的重要原因。

那么接下来详细说一说怎么使用W&B,官网有guide,写得很好,这里总结一个简单的入门版本,供参考。

1.安装

W&B 支持python3和python2,我貌似都试过,还是python3支持的好一些,所以建议conda create一个python3的环境,然后执行

pip install wandb

2. login

这一步为什么叫login呢,因为我们可以有2种方式来使用W&B,一种是使用云端,也就是这家公司提供的cloud服务,可以申请一个个人免费账户,然后执行

wandb login --host=https://api.wandb.ai

按照他的提示去拿到API Key即可。

但是,可能会有网络问题,比如我经常传不上去files,程序就会卡住,以及数据安全问题。还有一种方案,就是找一台电脑搭建local server,如何搭建local参考链接,如果你按照这里的操作搭建完一切正常,那么你运气超级好,恭喜你!但是,更经常的是会遇到打不开localhost:8080的问题,不要慌,我们探索到了解决方案,如下:

docker exec -it wandb-local bash
sudo mysql
use wandb_local
SELECT * FROM schema_migrations;

不停地执行最后一句,直到它返回的dirty=0,那么恭喜你,local server启动好了。然后执行:

wandb login --host=https://xxxxx:8080

这里的xxxx就是你的local server的ip。按照提示操作,同样获取API Key就可以了。

当然,我们的确可以偶尔云端跑,偶尔local跑,只要每次跑之前运行一下你到底要login到哪里去,你跑完的数据就会自动传到你login的地方去。

3.Run

首先我们需要更新一下我们的代码,参考这个链接,如果觉得太长不想看,那么参考下面这个写法:

run = wandb.init(config=args, 
                  project=args.env_name,
                  name=str(args.algorithm_name) + "_seed" + str(seed),
                  group=args.scenario_name,
                  dir=str(model_dir),
                  job_type="training",
                  reinit=True)
wandb.log({"value_loss": value_loss}, step=total_num_steps)
run.finish()

日常使用的话,这些就够了。

注意:

  1. 我们看group图的时候,应该用mean和std dev。

  2. 还可以探索一下report功能,团队协作的时候很好用。

  3. 数据可以导出,支持png和csv,也就是我们可以把想要的数据导出,然后画自己想要的plot风格。

  4. 网络问题会导致sync中断,解决这个问题的步骤很多,首先我们尽可能避免网络中断,那么学校里的服务器可以加上ping,每5分钟就走一点流量,让网络一直连着。甚至让它每天自动登录账号。

    crontab -e
    # 加入如下信息并保存
    */5 * * * * /bin/ping -c 20 baidu.com > /tmp/pingbaidu.txt
    * */5 * * * /bin/rm -r /tmp/pingbaidu.txt
    00 23 * * * #你的python(可以用which python读一下) #你的connect_net.py
    

    其次,一旦出了意外,网络还是中断了,那么不要慌,这不会影响你当前程序的训练情况,他会继续训练,如果训练完了网络还是没有恢复,他就会卡在最后的sync files阶段,一旦网络恢复了,他会把sync做完。如果他还没有训练完网络就恢复了,那么一切就等于无事发生。如果你设置了sweep,那么在网络中断阶段新的程序是跑不起来的,他不会创建任何的results文件,因为实际上没跑起来,他只会把config文件遍历完,但是问题也不大。BUT 上面所说的sync只有files文件,我们真正需要的 .wandb文件并没有sync成功,还是会停留在中断的位置,需要我们手动sync一下这个文件夹。

    wandb sync wandb/run-xxxxxxx
    

    如果一旦你是大批量跑了文件,那么也不要慌,我们安排个脚本直接sync一下全部文件。

    ls | grep -E "run|offline" | grep -v latest | xargs wandb sync --no-mark-synced
    

    设置了不要mark的原因是批量sync的时候,很可能也会sync那些正在跑的程序,我修改了一下wandb的源码,使得我们可以手动sync,但是我觉得最好还是不要标记了吧。

4. Sweep

W&B 还支持sweep,但是注意,我发现用了sweep之后显存无法释放【截止到20201015,已经在github上report issue了】,确实可以手动释放显存,除了略显愚蠢之外,就也还好。手动释放显存的命令参考如下:

sudo ps -ef | grep train | grep -v grep | cut -c 9-15 | xargs kill -9

20201016想到了一个更加智能的方案来解决显存问题,因为我发现它的PPID会变成1,因为wandb父进程已经被kill了:

ps -A -ostat,ppid,pid,cmd | grep -E "train|multiprocessing" | grep -v grep | awk '$2==1 {print $3}' | xargs kill -9

如何使用sweep呢?官网文档指路,下面是太长不看版本:

  1. 创建一个yaml文件,更多的config参见

    program: train/train_mpe.py
    project: sweep_MPE
    name: simple_spread_mlp
    command:
      - ${env}
      - python3
      - ${program}
      - --recurrent_policy
      - ${args}
    method: grid
    metric:
      goal: maximize
      name: average_episode_rewards
    parameters:
      env_name:
        distribution: constant
        value: "MPE"
      scenario_name:
        distribution: constant
        value: "simple_spread"
      algorithm_name:
        distribution: constant
        value: "hyper_sweep"
      num_agents:
        distribution: constant
        value: 3
      num_landmarks:
        distribution: constant
        value: 3
      seed:
        distribution: constant
        value: 1
      n_rollout_threads:
        distribution: constant
        value: 128
      data_chunk_length:
        distribution: constant
        value: 10
      num_env_steps:
        distribution: constant
        value: 10000000
      episode_length:
        distribution: constant
        value: 25
      num_mini_batch:
        distribution: constant
        value: 1 
      gain:
        distribution: constant
        value: 0.01
      lr:
        distribution: categorical
        values: [0.01, 0.001, 0.0001, 0.0005, 0.0007]
      ppo_epoch:
        distribution: categorical
        values: [10, 25]
    
  2. 创建一个sweep id

    wandb sweep sweep.yaml
    
  3. 开启sweep agent,可以在很多别的机器上运行,也可以在本机上运行,而且一次可以运行好几个agent

     wandb agent your-sweep-id
    

如果sweep结束了,你发现有一些东西需要重跑,那么要先删掉它们相关的文件,有run文件,server端要删掉,local端看心情吧。然后在server上resume sweep id,本地继续执行wandb agent命令,他就会自己跑剩下的实验。