Neo's Blog

“生活就是个缓慢受锤的过程”, 只是有的人像铁, 有的人像牛,有的人像铁牛...


  • Home

  • About

  • Archives

  • Categories

  • Tags

【小记】解决问题还是原装API好用

Posted on 2020-02-08 | In 随笔 / Writing
Symbols count in article: 390 | Reading time ≈ 1 mins.

很久以前,上算法课的时候猛然发现,原来所谓的“大部头”的真实含义不是难的让人头大,而是讲解深入浅出、容易理解,所以才会变成厚厚一本“大部头”。可是人总是在一次次重蹈覆辙中强化学习经验——最近在搞定一个小的技术问题时又猛然发现,查十个CSDN也不如看原装API来的清晰快速。

虽然自认为英语阅读能力也不差,但是一直在潜意识中还是规避去查英文资料,总想尽量先查中文资料以便快速解决问题。可现实情况往往是,查完一个中文博客解决不了问题,又查一个,又查一个,又一个…

等到解决了问题还不一定能发现,其实比去读原装官方API多花了更多时间——我倒完全没有认为英文博客就一定比中文博客好,二是说官方出的API一定比99%的中英文博客更好理解问题,更快速引入实用中——而剩下的1%,要么是中英文民间资料写的太优秀,比如stackoverflow,要么是官方API写的一言难尽,比如某Flow。

PyTorc添加网络图结构add_graph报错:RuntimeError: Cannot insert a Tensor that requires grad as a constant. Consider making it a parameter or input, or detaching the gradient

Posted on 2020-02-01 | Edited on 2020-02-25 | In 框架 / Framework , Debug
Symbols count in article: 1.3k | Reading time ≈ 1 mins.

错误说明

在使用PyTorch自带的TensorBoard的add_graph方法将网络图结构添加到监测信息中时,遇到如下报错:

1
RuntimeError: Cannot insert a Tensor that requires grad as a constant. Consider making it a parameter or input, or detaching the gradient.

这个信息其实有些tricky:

  • 告诉了是add_graph这一步有问题,但是具体哪个变量是带有不符合要求的属性不得而知
  • 格式是按照api照猫画虎的,怎么会不符合要求呢?

Debug过程

  1. 搜遍全网也没有找到结果,根据一些相关信息(见参考)的蛛丝马迹,首先怀疑是传入模型的Tensor的requires_grad设置问题,debug后发现其值为False(也应该是False,因为是从原始文件读入的数据)。

  2. 接下来,怀疑是模型output的Tensor的requires_grad的问题,但是没想到如何简便地更改add_graph中的模型输出Tensor的属性,因为这一步是在add_graph源码中的,当然也可以更改源码中的model(input_to_model)这里,使其所有输出的属性符合要求,但是这有点不elegant。

  3. 接下来从参考链接2中获得了一些启发,想到我使用的是多GPU训练,会不会是Dataparallel的问题呢?接下来又想到之前在知乎(链接3)看到关于读写Dataparallel的一些技巧,马上“灵光一闪”。先尝试了将add_graph放到模型并行化之前,果然没有报错,基本确定是Dataparallel的问题。

  4. 然后根据参考链接2和3,想到把模型先从并行化容器中取出来,再执行,果然问题完美解决。相关代码如下

    1
    2
    3
    4
    5
    6
     # setup the summary writer
    train_data_sample, label_sample = iter(dataloader_train).next()
    writer = SummaryWriter(args.summary_path, flush_secs=120)

    with writer:
    writer.add_graph(model.module,train_data_sample.to(device)) # model graph, with input

    重点就在model.module,这句话讲模型从并行化后的容器中取出来,以未并行化的模型(原始模型)返回,这样再执行就没有问题了。

参考

  1. https://github.com/pytorch/pytorch/issues/20101
  2. https://discuss.pytorch.org/t/how-to-reach-model-attributes-wrapped-by-nn-dataparallel/1373/4
  3. https://www.zhihu.com/question/67726969

Unable to determine the device handle... GPU is lost. Reboot the system to recover this GPU

Posted on 2020-01-08 | In 随笔 / Writing
Symbols count in article: 262 | Reading time ≈ 1 mins.

服务器上服务器上GPU频繁lost的情况,报错信息如下:

1
Unable to determine the device handle for GPU. GPU is lost. Reboot the system to recover this GPU.

主要原因可能有:

  1. 驱动问题
    • 解决办法:更新驱动;
  2. gpu过热导致,这种情况解决方法有这几种:
    • 将gpu风扇转速改为手动控制,调高转速(因为n卡gpu默认转速貌似永远不会超过70%)
    • 主板、gpu风扇清灰
  3. 电源供电不足导致,这种情况只能更换功率更大的电源解决

pytorch中model.eval()和“with torch.no_grad()区别

Posted on 2020-01-07 | Edited on 2020-01-08 | In 框架 / Framework , 随笔 / Writing
Symbols count in article: 750 | Reading time ≈ 1 mins.

两者区别

在PyTorch中进行validation时,会使用model.eval()切换到测试模式,在该模式下,

  • 主要用于通知dropout层和batchnorm层在train和val模式间切换
    • 在train模式下,dropout网络层会按照设定的参数p设置保留激活单元的概率(保留概率=p); batchnorm层会继续计算数据的mean和var等参数并更新。
    • 在val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。
  • 该模式不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反传(backprobagation)

  • 而with torch.zero_grad()则主要是用于停止autograd模块的工作,以起到加速和节省显存的作用,具体行为就是停止gradient计算,从而节省了GPU算力和显存,但是并不会影响dropout和batchnorm层的行为。

使用场景

如果不在意显存大小和计算时间的话,仅仅使用model.eval()已足够得到正确的validation的结果;而with torch.zero_grad()则是更进一步加速和节省gpu空间(因为不用计算和存储gradient),从而可以更快计算,也可以跑更大的batch来测试。

参考

  • https://discuss.pytorch.org/t/model-eval-vs-with-torch-no-grad/19615/38
  • https://ryankresse.com/batchnorm-dropout-and-eval-in-pytorch/

TensorFlow静态图机制和Tensorboard中手动添加监控数据(scalar/simple_value...)的方法

Posted on 2019-11-15 | Edited on 2019-12-06 | In 框架 / Framework
Symbols count in article: 3.7k | Reading time ≈ 3 mins.

说明

本文将介绍如何向tensorboard中添加sclar的方法,但会先尽量简要介绍一下tensorflow的静态图机制,查看添加方法可以直接去这一部分

Read more »

Python使用os.path.join只保留最后一个变量的原因

Posted on 2019-06-07 | In 随笔 / Writing
Symbols count in article: 144 | Reading time ≈ 1 mins.

在使用Python的os.path.join('a_path','bbb','/ccc')来合并路径时,合并的结果如果只保留了最后的’/ccc’,是因为最后的一个变量名包含了斜杠,函数会将其识别成绝对路径,因此就会忽略前面所以的其他路径。

解决npm install权限问题

Posted on 2019-04-19 | In 随笔 / Writing
Symbols count in article: 271 | Reading time ≈ 1 mins.

问题描述

当使用npm的install --save安装包时,可能会出现类似下面这样的权限问题:

1
2
3
4
npm ERR! path /Users/neo/Documents/sdsy888.github.io/node_modules/hexo-pdf
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access

并且这个问题即使使用sudo命令也无法解决。

解决办法

针对报错的文件,修改权限:

1
sudo chown -R `whoami` /Users/neo/Documents

Python中英文分词方法简介

Posted on 2019-04-12 | In 机器学习 / Machine Learning , 框架 / Framework , 工具 / Tools , 随笔 / Writing
Symbols count in article: 0 | Reading time ≈ 1 mins.

Python单型号*和双星号**用法总结

Posted on 2019-04-12 | In 机器学习 / Machine Learning , 框架 / Framework , 工具 / Tools , 随笔 / Writing
Symbols count in article: 0 | Reading time ≈ 1 mins.

Python中lambda使用总结

Posted on 2019-04-12 | In 机器学习 / Machine Learning , 框架 / Framework , 工具 / Tools , 随笔 / Writing
Symbols count in article: 0 | Reading time ≈ 1 mins.
<i class="fa fa-angle-left" aria-label="Previous page"></i>123…6<i class="fa fa-angle-right" aria-label="Next page"></i>
江前云后

江前云后

Interested in
Deep Learning & Computer Vision
56 posts
13 categories
23 tags
GitHub zhihu Weibo
© 2021 江前云后 | 48k | 43 mins.
Powered by Hexo v4.2.0
|
Theme – NexT.Pisces v7.0.1
|