pytorch nan处理
问题训练到中途出现Nan
原因暂时未知,按照 Weights become NaN values after first batch step中提到的方法:
torch.autograd.set_detect_anomaly(True)
```pythonfor name, param in model.named_parameters():print(name, torch.isfinite(param.grad).all())
好像在发生问题之前都是正常的:
![image-20210201204550453](/image-20210201204550453.png)
![image-20210201204701789](/image-20210201204701789.png)
# 解决方法
基本无解,只能做一个异常捕捉的处理
```python
loss = (w_loss + eps_loss) / 2. + un_loss + ...
hydra可重复性
问题虽然设置了pytorch和numpy的seed,然而同样的参数,用joblib跑出来的实验结果仍然是不同的,但是奇怪的是如果不用joblib,默认的launcher同样的参数直接跑却没问题
原因具体原因不详,猜测是和joblib有关。后通过实验验证:在main()外面设置的seed,在joblib的环境下不起效。
解决方法numpy很简单,直接在main()函数内部设置seed就可以了
pytorch稍微有点麻烦:
如果不用gpu,即不设置CUDA相关的deterministic的行为,和numpy一样在main函数内部直接设置seed即可
但是如果要使用gpu,则大概率要设置CUDA相关的deterministic的参数,此时直接在main()内部设置seed将会直接报错:TypeError: can't pickle CudnnModule objects,后查阅资料,Can’t pickle CudnnModule objects,发现ray也有这个问题,参考这个回答的做法就可以了
汇总从原来的:
import logging
import hydra
impo ...
pytorch不同Dataloader实现方式的比较
概述主要是两种实现方式:
同一个数据集,按照不同split的方式切分(比如5 Fold Validation),保存到本地,然后依次读入5种split
同一个数据集,全部一次性读入,然后按照不同的split的方式进行切分,按照迭代器或者生成器的方式返回切分后的dataset或者Dataloader
核心代码:
第一种方式
class Reuters(BaseDataLoader):
def __init__(self, root, batch_size, dataset_type, noise_type, noise_rate, seed, balance=True, shuffle=True,
modalities=[0, 1], num_workers=1):
self.dataset = ReutersDataset(root, dataset_type, noise_type, noise_rate, seed, balance, modalities)
logger.info('{ ...
hydra optuna sweeper TypeError: 'float' object is not iterable的错误
问题不论是直接跑 hydra-optuna-sweeper或者 facebookresearch/**hydra**的官方例子,都会报错TypeError: 'float' object is not iterable
原因optuna从2.4.0开始之后,要求主函数的返回的结果必须得是List[]类型的。这里出错的阶段是把运行结果tell给optuna的过程中,返回的结果是单一的float而不是list
解决方法在返回结果中添加一个list即可
from typing import Any
import hydra
from omegaconf import DictConfig
@hydra.main(config_path="conf", config_name="config")
def evaluate(cfg: DictConfig) -> Any:
x = cfg.x
y = cfg.y
# return (x - 2) ** 2 + y # 报错的原版
return [(x - 2) ** 2 + y]
...
docker-mongodb-sacred
Exit(100)的问题尝试用下述的命令启动MongoDB:
docker run --name mongo -p 27018:27018 -v /home/weitaotang/multimodal/pytorch_hydra_results_temp/mongo_data:/data/db mongo
猜测应该是权限问题,根据 Permission error with mongo when running docker:最佳的解决方法是不挂载,后期单独导出即可
但是这里还是想存到一个固定的地方,则这里只可以存在/tmp旗下的地方,不好。最好还是定期的export即可。
ipython无法启动
问题ipython无法启动:
无法使用remote debugger,表现为在ipython console中一输入命令就卡死。而后尝试单独用ipython/ipdb,发现症状类似,同样是输入ipython就会卡死
细查进程,发现一旦在ipython console开始输入命令后,就从原来的SL+变成了DL+
ipython --log-version=DEBUG发现卡死在搜索config中
原因参考 ipython won’t start
NFS文件系统挂载目录发生了变化,导致默认的sqlite无法使用。
# By default, IPython will put the history database in the IPython profile
# directory. If you would rather share one history among profiles, you can set
# this value in each, so that they are consistent.
#
# Due to an issue with ...
experiments-record
Image单模态,LR设为0.1不可训练(不可行)并没有tanaka在joint optimization中提到的high learning rate能有助于不学习label noise
可以看到symmetric 0.4或者asymmetric 0.6在lr 0.1(10x)的情况下,准确率很差
symmetric noise 0.4,lr 0.1 vs lr 0.01
asymmetric 0.4 lr 0.1 vs lr 0.01
LR设为0.05 0.005也不可行
symmetric noise 0.4的情况下,对比可以看到0.1,0.05,0.005都不太行,只有0.01比较好
看loss也可以一开始的loss都是不太一样的,但是后面越训练越趋近
T Revision MNIST测试symmetric noise 0.4默认参数测试MNIST 默认batch_size=128来看,估计的还算比较准确
batch_size = 12800, lr = 0.1可以看到效果更差了,还是默认的参数比较好。而且也和估计前学习到的classifier有关
asy ...
pytorch-meta-learning
Pytorch 在Meta Learning计算中的不足正如 higher 首页所说
higher is a library providing support for higher-order optimization, e.g. through unrolled first-order optimization loops, of “meta” aspects of these loops. It provides tools for turning existing torch.nn.Module instances “stateless”, meaning that changes to the parameters thereof can be tracked, and gradient with regard to intermediate parameters can be taken. It also provides a suite of differentiable optimizers, to facilitate the implementation of v ...
zsh-usage
安装zsh配置zshsource ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
更改默认shell参考 configure tmux to zsh
最佳的方式,在.tmux.conf中更改
set-option -g default-command "/home/weitaotang/local/bin/zsh" # path_to_zsh
python的多进程使用
参考:
强烈推荐这个 【Multiprocessing系列】Multiprocessing基础,清晰易懂,尤其推荐里面的两篇资源共享系列 【Multiprocessing系列】共享资源 【Multiprocessing系列】子进程返回值,其中后者更通用,因为前者里面的方法Windows不适用
简单的模版可以参考正确使用 Multiprocessing 的姿势
一文看懂Python多进程与多线程编程(工作学习面试必读) 开篇关于线程、进程的说明很清晰
一篇文章搞定Python多进程(全) 可以参考里面的例子。特别是最后一个关于map的例子
莫凡的例子也不错 进程池 Pool
基础概念一些api
创建Process相关的:multiprocessing.Process()
可以直接调用默认的构造函数,创建新的进程
也可以继承Process,像Thread的使用那样
.join()方法用来阻塞主进程(多线程时也是一样的含义),**即某子进程调用.join()方法,则主进程会一直等到该子进程介绍,或者到达设定的时间,才会继续执行join后面的代码。详参 python多进程的理解 ...