Weights & Biases使用指南
Weights & Biases 简单来说就是进阶版的tensorboard,功能更加强大,如果要详细说它跟tensorboard有什么不同,参考官网的这一段解释。附图如下:
我个人比较看中的是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()
日常使用的话,这些就够了。
注意:
-
我们看group图的时候,应该用mean和std dev。
-
还可以探索一下report功能,团队协作的时候很好用。
-
数据可以导出,支持png和csv,也就是我们可以把想要的数据导出,然后画自己想要的plot风格。
-
网络问题会导致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呢?官网文档指路,下面是太长不看版本:
-
创建一个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]
-
创建一个sweep id
wandb sweep sweep.yaml
-
开启sweep agent,可以在很多别的机器上运行,也可以在本机上运行,而且一次可以运行好几个agent
wandb agent your-sweep-id
如果sweep结束了,你发现有一些东西需要重跑,那么要先删掉它们相关的文件,有run文件,server端要删掉,local端看心情吧。然后在server上resume sweep id,本地继续执行wandb agent命令,他就会自己跑剩下的实验。