
量子位 报道 | 公众号 QbitAI
到底是怎样的一个bug,能让95%的Pytorch库中招,就连特斯拉AI总监深受困扰?
还别说,这个bug虽小,但有够“狡猾”的。
这就是最近Reddit上热议的一个话题,是一位网友在使用再平常不过的Pytorch+Numpy组合时发现。
最主要的是,在代码能够跑通的情况下,它甚至还会影响模型的准确率!
除此之外,网友热议的另外一个点,竟然是:
而是它到底算不算一个bug?
这究竟是怎么一回事?
事情的起因是一位网友发现,在PyTorch中用NumPy来生成随机数时,受到数据预处理的限制,会多进程并行加载数据,但最后每个进程返回的随机数却是相同的。
他还举出例子证实了自己的说法。
如下是一个示例数据集,它会返回三个元素的随机向量。这里采用的批量大小分别为2,工作进程为4个。
然后神奇的事情发生了:每个进程返回的随机数都是一样的。
这个结果会着实让人有点一头雾水,就好像数学应用题求小明走一段路程需要花费多少时间,而你却算出来了负数。
发现了问题后,这位网友还在GitHub上下载了超过10万个PyTorch库,用同样的方法产生随机数。
结果更加令人震惊:居然有超过95%的库都受到这个问题的困扰!
这其中不乏PyTorch的官方教程和OpenAI的代码,连特斯拉AI总监Karpathy也承认自己“被坑过”!
但有一说一,这个bug想要解决也不难:只需要在每个epoch都重新设置seed,或者用python内置的随机数生成器就可以避免这个问题。
到底是不是bug?
如果这个问题已经可以解决,为什么还会引起如此大的讨论呢?
因为网友们的重点已经上升到了“哲学”层面:
这到底是不是一个bug?
在Reddit上有人认为:这不是一个bug。
虽然这个问题非常常见,但它并不算是一个bug,而是一个在调试时不可以忽略的点。
就是这个观点,激起了千层浪花,许多人都认为他忽略了问题的关键所在。
这不是产生伪随机数的问题,也不是numpy的问题,问题的核心是在于PyTorch中的DataLoader的实现
对于包含随机转换的数据加载pipeline,这意味着每个worker都将选择“相同”的转换。而现在NN中的许多数据加载pipeline,都使用某种类型的随机转换来进行数据增强,所以不重新初始化可能是一个预设。
另一位网友也表示这个bug其实是在预设程序下运行才出现的,应该向更多用户指出来。
并且95%以上的Pytorch库受此困扰,也绝不是危言耸听。
有人就分享出了自己此前的惨痛经历:
我认识到这一点是之前跑了许多进程来创建数据集时,然而发现其中一半的数据是重复的,之后花了很长的时间才发现哪里出了问题。
也有用户补充说,如果 95% 以上的用户使用时出现错误,那么代码就是错的。
顺便一提,这提供了Karpathy定律的另一个例子:即使你搞砸了一些非常基本代码,“neural nets want to work”。
你有踩过PyTorch的坑吗?
如上的bug并不是偶然,随着用PyTorch的人越来越多,被发现的bug也就越来越多,某乎上还有PyTorch的坑之总结,被浏览量高达49w。
其中从向量、函数到modeltrain(),无论是真bug还是自己出了bug,大家的血泪史还真的是各有千秋。
所以,关于PyTorch你可以分享的经验血泪史吗?
欢迎评论区留言讨论~
参考链接:
[1]>1GPU:计算机图显核心
11 GPU:计算机图形显示核心
GPU基本概念:图形处理器(graphics processing unit,缩写GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。
GPU是显卡的处理器:显卡全称显示适配卡,又称显示适配器,用于协助CPU进行图像处理,作用是将CPU送来的图像信号经过处理再输送到显示器上,由主板连接设备、监视器连接设备、处理器和内存组成,GPU即是显卡处理器。
12 GPU擅长大规模并发计算
GPU工作原理:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出,一般分为顶点处理、光栅化计算、纹理贴图、像素处理、输出五个步骤。GPU采用流式并行计算模式,可对每个数据行独立的并行计算。
GPU与CPU区别:CPU基于低延时设计,由运算器(ALU)和控制器(CU),以及若干个寄存器和高速缓冲存储器组成,功能模块较多,擅长逻辑控制,串行运算。GPU基于大吞吐量设计,拥有更多的ALU用于数据处理,适合对密集数据进行并行处理,擅长大规模并发计算,因此GPU也被应用于AI训练等需要大规模并发计算场景。
13 GPU可分为独立GPU和集成GPU
独立GPU:独立GPU一般封装在独立的显卡电路板上,使用专用的显示存储器,独立显卡性能由GPU性能与显存带宽共同决定。一般来讲,独立GPU的性能更高,但因此系统功耗、发热量较大。
集成GPU:集成GPU常和CPU共用一个Die,共享系统内存。集成GPU的制作由CPU厂家完成,因此兼容性较强,并且功耗低、发热量小。但如果显卡运行需要占用大量内存,整个系统运行会受限,此外系统内存的频率通常比独立显卡的显存低很多,因此一般集成GPU的性能比独立GPU更低。
14 GPU广泛运用在图显和并行计算场景
GPU拥有单一的强大并行计算能力,所以用途往往是需要大规模并行计算的场景。早期GPU多被用于2D和3D图形的计算和处理,因为图形数据的处理往往涉及到大量的大型矩阵运算,计算量大但易于并行化。近年由于大数据、人工智能发展,GPU也常常被用于需要大量重复计算的数据挖掘领域,如机器学习,深度学习等。
GPU使用场景:GPU被广泛地运用于PC、服务器、移动等领域。其中服务器GPU可做专业图形处理、计算加速、深度学习等应用,以独立GPU为主;移动端GPU主要采用集成GPU;PC根据使用用途不同,既可以搭载独立GPU,也可以使用集成GPU。
15 全球GPU巨头:NVIDIA、AMD
NVIDIA(英伟达):创立于1993年,1999年发明了GPU,最初专注PC图形,后来拓展到密集计算领域,Nvidia利用GPU创建了科学计算、人工智能、数据科学、自动驾驶汽车、机器人技术、AR和VR的平台。 Nvidia是目前全球最大的独立GPU供应商,2020年营收1668亿美元,2021Q2 Nvidia全球独立GPU市场份额达到83%。
AMD(超威半导体):成立于1969年,目前业内稀缺的可以提供高性能CPU、高性能独立显卡GPU、主板芯片组三大组件的半导体公司。2020年AMD营收976亿美元,其中计算和图形(包括CPU、GPU、APU等)业务营收643亿美元,2021Q2 AMD全球独立GPU市场份额达到17%。
2GPU两大应用场景:图显、计算
21 2020全球GPU市场规模接近千亿美元
2020年全球GPU市场规模达到9991亿美元。3D图像显示、人工智能深度学习的需求支撑GPU市场持续增长,根据Verified Market Research数据,2020年全球GPU市场规模达到9991亿美元,预计2028年达到15816亿美元,CAGR为59%。
测算2020年中国大陆独立GPU市场规模约235亿美元。中国是全球GPU市场重要组成部分,2020年Nvidia、AMD在中国大陆收入占比分别为233%、239%,我们假设中国大陆独立GPU市场占全球235%,测算2020年中国大陆独立GPU市场规模约为235亿美元。
22 PC GPU:2020年全球出货394亿片
PC(个人电脑)是GPU重要应用场景,根据Jon Peddie Research(JPR)数据,2020年全球GPU出货394亿片,同比增长179%。
23 PC GPU:Nvidia和AMD占据独立GPU市场
Intel领导集成GPU市场。Intel(英特尔)是全球最大的CPU制造商,2021Q2占据全球775%的x86 CPU市场,集成GPU集成在CPU中,Intel凭借CPU市场地位,占据全球PC GPU大部分市场。根据JPR数据,2021Q2 Intel占据全球683%的PC GPU市场份额,Nvidia和AMD市场份额分别为152%、165%。
Nvidia和AMD占据独立GPU市场。在独立GPU领域,Nvidia具备明显的份额领先,2021Q2市占率达到83%。2006年AMD收购ATI,2010年放弃ATI品牌后推出AMD Radeon(镭龙)独立显卡系列,2021Q2 AMD独立PC GPU市场份额17%。
24 AI服务器与加速芯片
AI服务器:通常搭载GPU、FPGA、ASIC等加速芯片,利用CPU与加速芯片的组合可以满足高吞吐量互联的需求,为自然语言处理、计算机视觉、机器学习等AI应用场景提供强大的算力支持,支撑AI算法训练和推理过程。
AI加速芯片:由于CPU并不适合大规模并行计算,因此需要加速芯片执行AI算法,目前AI加速芯片主要包括图形处理器(graphics processing unit,GPU)、现场可编程门阵列(field-programmable gate array,FPGA)、专用集成电路(application specific integrated circuits,ASIC)、神经拟态芯片等。
25 GPU是AI服务器首选加速方案
服务器是AI核心基础设施。根据IDC数据,2020年中国AI基础设施市场规模为393亿美元,同比增长268%,并将在2024年达到780亿美元,其中2020年服务器市场规模占AI基础设施的87%以上,承担着最为重要的角色。
互联网行业是AI服务器最大采购行业。根据IDC数据,2020年上半年,互联网占整体加速计算服务器市场近60%的份额,同比增持超过100%;政府行业和服务业分别依次位居第二位和第三位。
GPU服务器是AI加速方案首选。IDC预计2021年中国GPU服务器占比919%左右的市场份额,是数据中心AI加速方案首选。根据IDC数据,2019年中国GPU服务器市场规模达到20亿美元,预计2024年将达到64亿美元。
26 AI服务器通常配置多个GPU芯片
GPU加速服务器能够提供优秀的浮点计算能力,从容应对高实时、高并发的海量计算场景,例如深度学习、科学计算、3D动画渲染、CAE等应用场景。
3NVIDIA:全球GPU巨头
31 全球GPU巨头
Nvidia成立于1993年,1999年上市,市值近10年增长超过83倍,近6年增长超过49倍。截至2021年11月5日,Nvidia总市值7438亿美元,总市值美股排名第七,是目前全球市值最大的半导体公司。(报告来源:未来智库)
32 三大因素推动地位提升
技术革新、场景拓展、外延并购,Nvidia引领全球GPU发展。
GPU架构:Nvidia坚持每2-3年推出一代新的GPU架构,持续保持技术领先,新的Ampere已经采用7nm工艺;应用场景:从最初图形处理到通用计算,再到AI深度学习和自动驾驶,Nvidia不断推动GPU应用场景的突破;外延并购:2000-2008年Nvidia密集收购额多家公司,涵盖显卡、图形处理、半导体等多个领域,2020年宣布计划收购ARM。
33 近年业绩高速增长
Nvidia产品主要分为两大类:图形处理、计算&网络。下游市场包括游戏、专业可视化、数据中心、汽车四大类。
2020年Nvidia营收1668亿美元(yoy+527%),净利润433亿美元(yoy+549%),其中图形处理业务营收983亿美元,计算&网络业务营收684亿美元。除去2019年游戏市场需求波动造成业绩下滑外,Nvidia近5年营收、利润均保持较快增长。
得益于基于Ampere架构新GPU产品带动游戏业务高增,以及数据中心对算力需求旺盛,2021上半年Nvidia营收、净利润快速增长。
34 游戏是最大市场,数据中心市场增速较快
Nvidia下游市场分为四类:游戏、专业可视化、数据中心、汽车,各市场重点产品如下:
游戏:GeForce RTX/GTX系列GPU(PCs)、GeForce NOW(云游戏)、SHIELD(游戏主机);专业可视化:Quadro/RTX GPU(企业工作站);数据中心:基于GPU的计算平台和系统,包括DGX(AI服务器)、HGX(超算)、EGX(边缘计算)、AGX(自动设备);汽车:NVIDIA DRIVE计算平台,包括AGX Xavier(SoC芯片)、DRIVE AV(自动驾驶)、DRIVE IX(驾驶舱软件)、Constellation(仿真软件)。
35 计算业务驱动高成长
计算业务是Nvidia成长的主要驱动力:数据中心已成规模,智能汽车将进入收获期。
在数据中心市场,Nvidia拥有芯片、硬件、硬件的全栈布局。得益于全球AI应用场景的快速增加,对算力的需求飙升。是Nvidia成长最快的市场,2020年营收达到约6696亿美元,近4年CAGR达到685%,远高于游戏市场的176%。2020年Nvidia数据中心市场营收占比已经超过40%,预计未来仍将继续提升。
在智能汽车市场, Nvidia形成了全栈式自动驾驶解决方案。AGX Xavier芯片于2018年开始出货,下一代自动驾驶芯片Orin计划用于2022年量产,算力将达到254TOPS,目前已经获得蔚来、理想、沃尔沃、奔驰等多个整车厂定点项目。我们认为2022年高阶自动驾驶汽车或将集中落地,Nvidia自动驾驶将进入收获期。
36 中国大陆收入贡献提升
Nvidia中国大陆收入快速增长。2020年Nvidia来自中国大陆收入3886亿美元,同比增长423%,近4年CAGR达到314%,同期Nvidia整体营收CAGR为246%。
Nvidia中国大陆收入占比呈上升趋势。2020年Nvidia中国大陆收入占比达到233%,相比于2016年的189%提升44pct,2021上半年Nvidia中国大陆收入占比256%,上升趋势明显。
我们预计中国大陆占比仍将提升。图显业务层面,人均收入提升将带动PC需求增加;计算业务层面,目前中国大陆在AI算法、应用层面具有领先优势,自动驾驶场景也将率先得到释放。
4景嘉微:国产GPU领军
41 国内唯一商用GPU公司
景嘉微成立于2006年,公司主营业务分为图形显控、小型专用化雷达、GPU芯片三类。其中图显、雷达产品主要面向军用市场,GPU芯片产品包括JM5400、JM7200,其中JM5400主要应用于公司图显模块中,JM7200成功拓展了民用和信创市场。2021年9月,公司第三代GPU芯片JM9成功流片,目前正在进行性能测试。
42 两个系列、三款GPU量产应用
景嘉微已完成两个系列、三款GPU芯片量产应用。第一代GPU产品JM5400于2014年流片成功,主要支撑军用装备,已在国产军用飞机上实现了对ATI M9、M54、M72等芯片的替代;第二代产品JM7200于2018年8月流片成功,性能与 Nvidia的GT640显卡相近。在JM7200基础上,公司又推出1Target 1 is out of bounds,(1)分类问题中,dataset里数据处理后,label的范围必须是[0,class_num-1],这里的label会作为损失函数的target。(换一种说法,假如对分类的结果有3种,cat、dog、bird,那么label也即loss_func的target的范围必须是[0,1,2])。注:nnNLLoss貌似有一样的问题?(2)检查网络结构,最后一层的输出有几个
2Using a target size (torchSize([32])) that is different to the input size (torchSize([32, 1])) is deprecated Please ensure they have the same size,这个问题我在二分类问题中遇到的,损失函数的target是一维的,但是model的输出也即损失函数的input是二维的。
3使用CrossEntropyLoss函数,我们的模型里面的最后一层全连接层的输出一般大于1,这时候dataset里的label必须是一个一维的LongTensor类型,不然会在下面进行训练时计算loss的时候报错1D target tensor expected, multi-target not supported;
4expected scalar type Long but found Float,这个通样是在dataset定义的时候出现的,dataset的label的应该是一个一维tensor(如第3条所说),比如我是对数字分类,label就是1,2,3…等具体的数字,在训练的时候,使用CrossEntropyLoss函数的时候它会将一维的tensor转换成one-hot进行计算损失。pytorch有两个包无法原因是PyTorch的包没有放在anaconda及free通道和镜像源。根据查询相关公开信息显示,pytorch有两个包无法下载是因为PyTorch的包并没有放在anaconda以及它的free通道和镜像源上,所以会从pytorch官方指定的地址下载包,而这个文件存储在亚马逊S3上,因此下载时几乎无法下载。可以在浏览器或终端中设置代理服务器,以便更加稳定地进行下载。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)