pytorch怎么读,《深度学习框架PyTorch:入门与实践》epub下载在线阅读全文,求百度网盘云资源
pytorch怎么读,《深度学习框架PyTorch:入门与实践》epub下载在线阅读全文,求百度网盘云资源详细介绍
本文目录一览: pytorch怎么读
pytorch的读音是'pa?t??t?。
PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
PyTorch的优点:
1、相当简洁且高效快速的框架。
2、设计追求最少的封装。
3、设计符合人类思维,它让用户尽可能地专注于实现自己的想法。
4、与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新。
5、PyTorch作者亲自维护的论坛供用户交流和求教问题。
6、入门简单。
phthon怎么念
python,英[?pa?θ?n],美[?pa?θɑ?n]。
拓展资料:
Python(中文读作“派森”)是一种高级编程语言,广泛应用于软件开发、数据分析、机器学习和人工智能等领域。下面将介绍Python的双语例句,帮助您更好地理解Python的应用和特点。
什么是Python?
Python是一种易于学习和理解的编程语言。它具有简洁的语法和丰富的库,使得开发者可以快速而轻松地实现各种功能。Python具有动态类型和自动内存管理的特性,减轻了编程过程中的繁琐操作,提高了开发效率。
Python在Web开发中的应用
Python可以用于开发Web应用程序。例如,使用Django或Flask等Web框架,可以快速搭建功能强大的网站和Web服务。Python的简单易读的语法和丰富的库为Web开发提供了良好的支持。同时,Python还具有处理大量并发请求的能力,可用于构建高效的Web应用。
Python在数据分析中的应用
Python被广泛应用于数据科学和数据分析领域。例如,使用NumPy、Pandas和Matplotlib等库,可以进行数据清洗、处理和可视化。
Python提供了强大的数据分析工具和算法,可以帮助开发者更好地理解和解释数据。同时,Python的易用性和扩展性也使得数据分析工作更加高效和便捷。
Python在人工智能和机器学习中的应用
Python被广泛应用于人工智能和机器学习领域。例如,使用TensorFlow、PyTorch和Scikit-learn等库,可以实现各种复杂的机器学习和深度学习算法。
Python具有丰富的科学计算库和机器学习工具,为开发者提供了构建智能系统和解决现实问题的能力。同时,Python还支持大规模数据处理和分布式计算,适用于处理大型数据集和训练深度神经网络。
Python在软件开发中的优势
Python具有优雅简洁的语法,使得代码易读易懂,降低了开发和维护成本。Python拥有丰富的开源库和工具生态系统,可以加速软件开发过程,提高开发效率。Python支持跨平台运行,适用于Windows、Linux和Mac等操作系统,具有良好的可移植性。
phyon是什么意思
Python是一种高级编程语言,由吉多·范罗苏姆于1991年首次发布。Python的设计目标是发展一种“易于阅读、易于学习、易于使用和易于维护”的编程语言。它能够在不同的平台上运行,包括Windows、macOS和Linux。Python语言的特点包括:语法简洁、易于学习、代码可读性好、支持多种编程范式、具有丰富的标准库、具有良好的扩展性、可与其他编程语言(如C++、Java)互操作等。
Python在数据科学、人工智能、机器学习、Web开发等领域广泛使用。一些流行的Python框架包括NumPy、SciPy、Pandas、TensorFlow、PyTorch和Django等。Python还具有一个庞大的开源社区和活跃的社交网络支持。
Python有大量的数据科学和机器学习库,包括Scikit-learn、Keras、TensorFlow等,这些库使Python成为一种强大的数据科学工具。在数据探索、数据可视化、统计分析和机器学习等领域,Python都是一种非常受欢迎的编程语言。例如,数据科学家可以使用Python进行数据清洗、预处理、分析和可视化。机器学习工程师可以使用Python中的机器学习库来构建、训练和评估各种机器学习模型。Python已成为数据科学和机器学习领域最流行的语言之一。
《深度学习框架PyTorch:入门与实践》epub下载在线阅读全文,求百度网盘云资源
《深度学习框架PyTorch:入门与实践》(陈云)电子书网盘下载免费在线阅读
链接: https://pan.baidu.com/s/1Pkdl-Tbi-dwAlhPrinpYcA
提取码: 2uu9
书名:深度学习框架PyTorch:入门与实践
作者:陈云
豆瓣评分:6.7
出版社:电子工业出版社
出版年份:2018-1
页数:300
内容简介:
《深度学习框架PyTorch:入门与实践》从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识。结合基础知识和前沿研究,带领读者从零开始完成几个经典有趣的深度学习小项目,包括GAN生成动漫头像、AI滤镜、AI写诗等。《深度学习框架PyTorch:入门与实践》没有简单机械地介绍各个函数接口的使用,而是尝试分门别类、循序渐进地向读者介绍PyTorch的知识,希望读者对PyTorch有一个完整的认识。
《深度学习框架PyTorch:入门与实践》内容由浅入深,无论是深度学习的初学者,还是第一次接触PyTorch的研究人员,都能在学习本书的过程中快速掌握PyTorch。即使是有一定PyTorch使用经验的用户,也能够从本书中获得对PyTorch不一样的理解。
作者简介:
陈云
Python程序员、Linux爱好者和PyTorch源码贡献者。主要研究方向包括计算机视觉和机器学习。“2017知乎看山杯机器学习挑战赛”一等奖,“2017天池医疗AI大赛”第八名。 热衷于推广PyTorch,并有丰富的使用经验,活跃于PyTorch论坛和知乎相关板块。
核心支持库加载失败是怎么回事?
1、文件访问去权限。请检查你登陆的账户在软件安装的硬盘是否有足够权限。2、模板文件损坏。 建议卸载后重新安装,卸载时取消“保留用户配置文件”的勾选,安装时候右键单击安装程序选择“以管理员身份运行”试试。
明敏 发自 凹非寺
量子位 报道 | 公众号 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。
其中从向量、函数到model.train(),无论是真bug还是自己出了bug,大家的血泪史还真的是各有千秋。
所以,关于PyTorch你可以分享的经验血泪史吗?
欢迎评论区留言讨论~
参考链接:
[1]https://tanelp.github.io/posts/a-bug-that-plagues-thousands-of-open-source-ml-projects/
[2]https://www.reddit.com/r/MachineLearning/comments/mocpgj/p_using_pytorch_numpy_a_bug_that_plagues/
[3]https://www.zhihu.com/question/67209417/answer/866488638
— 完 —
明敏 发自 凹非寺
量子位 报道 | 公众号 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。
其中从向量、函数到model.train(),无论是真bug还是自己出了bug,大家的血泪史还真的是各有千秋。
所以,关于PyTorch你可以分享的经验血泪史吗?
欢迎评论区留言讨论~
参考链接:
[1]https://tanelp.github.io/posts/a-bug-that-plagues-thousands-of-open-source-ml-projects/
[2]https://www.reddit.com/r/MachineLearning/comments/mocpgj/p_using_pytorch_numpy_a_bug_that_plagues/
[3]https://www.zhihu.com/question/67209417/answer/866488638
— 完 —
明敏 发自 凹非寺
量子位 报道 | 公众号 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。
其中从向量、函数到model.train(),无论是真bug还是自己出了bug,大家的血泪史还真的是各有千秋。
所以,关于PyTorch你可以分享的经验血泪史吗?
欢迎评论区留言讨论~
参考链接:
[1]https://tanelp.github.io/posts/a-bug-that-plagues-thousands-of-open-source-ml-projects/
[2]https://www.reddit.com/r/MachineLearning/comments/mocpgj/p_using_pytorch_numpy_a_bug_that_plagues/
[3]https://www.zhihu.com/question/67209417/answer/866488638
— 完 —
明敏 发自 凹非寺
量子位 报道 | 公众号 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。
其中从向量、函数到model.train(),无论是真bug还是自己出了bug,大家的血泪史还真的是各有千秋。
所以,关于PyTorch你可以分享的经验血泪史吗?
欢迎评论区留言讨论~
参考链接:
[1]https://tanelp.github.io/posts/a-bug-that-plagues-thousands-of-open-source-ml-projects/
[2]https://www.reddit.com/r/MachineLearning/comments/mocpgj/p_using_pytorch_numpy_a_bug_that_plagues/
[3]https://www.zhihu.com/question/67209417/answer/866488638
— 完 —
wps核心支持库加载失败的原因如下:
1、文件访问去权限,请检查登录的账户在软件安装的硬盘是否有足够权限。
2、模板文件损坏,建议卸载后重新安装。
WPSOffice具有内存占用低、运行速度快、体积小巧、强大插件平台支持、免费提供海量在线存储空间及文档模板、支持阅读和输出PDF文件、全面兼容微软MicrosoftOffice格式(doc/docx/xls/xlsx/ppt/pptx等)独特优势。
扩展资料:
WPSOffice支持桌面和移动办公。且WPS移动版通过GooglePlay平台,已覆盖的50多个国家和地区,WPSforAndroid在应用排行榜上领先于微软及其他竞争对手,居同类应用之首。
由于WPS诞生于DOS流行的时代里DOS起初仅仅只是磁盘操作系统它所提供的只是底层磁盘与内存的资源管理和利用手段。用户的界面完全由应用软件开发商从最底层自行设计这一点与今天在视窗与麦金塔系统下开发是完全不同的。下拉式菜单在当时最为著名它为使用提供了便利。
PyTorch 深度剖析:并行训练的 DP 和 DDP 分别在什么情况下使用及实例
作者丨 科技 猛兽
编辑丨极市平台
这篇文章从应用的角度出发,介绍 DP 和 DDP 分别在什么情况下使用,以及各自的使用方法。以及 DDP 的保存和加载模型的策略,和如何同时使用 DDP 和模型并行 (model parallel)。
PyTorch 提供了几种并行训练的选项。
Data Parallel 这种方法允许我们以最小的代码修改代价实现有1台机器上的多张 GPU 的训练。只需要修改1行代码。但是尽管 Data Parallel 这种方法使用方便,但是 Data Parallel 的性能却不是最好的。我们先介绍下 torch.nn.DataParallel 这个 PyTorch class。
定义:
CLASS torch.nn.DataParallel (module,device_ids=None,output_device=None,dim=0)
torch.nn.DataParallel 要输入一个 module ,在前向传播过程中,这个 module 会在每个 device 上面复制一份。同时输入数据在 batch 这个维度被分块,这些数据会被按块分配在不同的 device 上面。最后形成的局面就是:所有的 GPU 上面都有一样的 module ,每个 GPU 都有单独的数据。在反向传播过程中,每一个 GPU 上得到的 gradient 会汇总到主 GPU (server) 上面。主 GPU (server) 更新参数之后,还会把新的参数模型参数 broadcast 到每个其它的 GPU 上面。
DP 使用的是 Parameter Server (PS) 架构。 Parameter Server 架构 (PS 模式) 由 server 节点和 worker 节点组成,server 节点的主要功能是初始化和保存模型参数、接受 worker 节点计算出的局部梯度、汇总计算全局梯度,并更新模型参数。
worker 节点的主要功能是各自保存部分训练数据,初始化模型,从 server 节点拉取最新的模型参数 (pull),再读取参数,根据训练数据计算局部梯度,上传给 server 节点 (push)。
PS 模式下的 DP,会造成负载不均衡,因为充当 server 的 GPU 需要一定的显存用来保存 worker 节点计算出的局部梯度;另外 server 还需要将更新后的模型参数 broadcast 到每个 worker,server 的带宽就成了 server 与worker 之间的通信瓶颈,server 与 worker 之间的通信成本会随着 worker 数目的增加而线性增加。
所以读完了以上的分析,自然而然的2个要求就是:
下面是2条重要的注意信息:
参数定义:
使用:
这一节通过具体的例子展示 DataParallel 的用法。
1) 首先 Import PyTorch modules 和超参数。
2) 设置 device。
3) 制作一个dummy (random) dataset,这里我们只需要实现 getitem 方法。
4) 制作一个示例模型。
5) 创建 Model 和 DataParallel,首先要把模型实例化,再检查下我们是否有多块 GPU。最后是 put model on device:
输出:
6) Run the Model:
输出:
以上就是 DataParellel 的极简示例,注意我们并没有告诉程序我们要使用多少块 GPU,因为 torch.cuda.device_count() 会自动地计算出当前的所有可用的 GPU 数,假设电脑里面是8块,那么输出就会是:
Distributed Data Parallel 这种方法允许我们在有1台或者多台的机器上分布式训练。与 Data Parallel 的不同之处是:
我们先介绍下 torch.nn.parallel.DistributedDataParallel 这个 PyTorch class。
定义:
CLASS torch.nn.parallel.DistributedDataParallel (module,device_ids=None,output_device=None,dim=0,broadcast_buffers=True,process_group=None,bucket_cap_mb=25,find_unused_parameters=False,check_reduction=False,gradient_as_bucket_view=False)
torch.nn.DistributedDataParallel
torch.nn.DataParallel 要输入一个 module ,在模型构建的过程中,这个 module会在每个 device 上面复制一份。同时输入数据在 batch 这个维度被分块,这些数据会被按块分配在不同的 device 上面。最后形成的局面就是:所有的 GPU 上面都有一样的 module,每个 GPU 都有单独的数据。在反向传播过程中,每一个 GPU 上得到的 gradient 会被平均。
使用这个 class 需要 torch.distributed 的初始化,所以需要调用 [torch.distributed.init_process_group()](https://link.zhihu.com/?target=https%3A//pytorch.org/docs/stable/distributed.html%23torch.distributed.init_process_group) 。
如果想在一个有 N 个 GPU 的设备上面使用 DistributedDataParallel,则需要 spawn up N 个进程,每个进程对应0-N-1 的一个 GPU。这可以通过下面的语句实现:
i from 0-N-1,每个进程中都需要:
为了在每台设备 (节点) 上建立多个进程,我们可以使用 torch.distributed.launch 或者 torch.multiprocessing.spawn 。
如果你在一个进程中使用 torch.save 来保存模型,并在其他一些进程中使用 torch.load 来加载模型,请确保每个进程的 map_location 都配置正确。如果没有 map_location,torch.load 会将从保存的设备上加载模型。
几点注意:
参数定义:
这一节通过具体的例子展示 DistributedDataParallel 的用法,这个例子假设我们有一个8卡 GPU。
1) 首先初始化进程:
2) 创建一个 toy module,叫它 ToyModel,用 DDP 去包裹它。注意,由于 DDP 在构造函数中把模型状态从第rank 0 的进程广播给所有其他进程,所以我们无需担心不同的 DDP 进程从不同的参数初始值启动。PyTorch提供了 mp.spawn 来在一个节点启动该节点所有进程,每个进程运行 train(i, args) ,其中 i 从0到 args.gpus - 1 。所以有以下 code。
执行代码时,GPU 数和进程数都是 world_size。
当使用 DDP 时,我们只在一个进程中保存模型,然后将其加载到所有进程中,以减少写的开销。这也很好理解,因为所有进程从相同的参数开始,梯度在后向传递中是同步的,因此,所有进程的梯度是相同的。所以读者请确保所有进程在保存完成之前不要开始加载。此外,在加载模块时,我们需要提供一个适当的 map_location 参数,以防止一个 process 踏入其他进程的设备。如果缺少 map_location,torch.load 将首先把 module 加载到 CPU,然后把每个参数复制到它被保存的地方,这将导致同一台机器上的所有进程使用同一组设备。
有关模型并行的介绍可以参考:
DDP 也适用于 multi-GPU 模型 。DDP 包裹着 multi-GPU 模型 ,在用海量数据训练大型模型时特别有帮助。
当把一个 multi-GPU 模型 传递给 DDP 时,device_ids 和 output_device 不能被设置。输入和输出数据将被应用程序或模型 forward() 方法放在适当的设备中。
参考:
https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html
https://pytorch.org/docs/stable/notes/ddp.html
笔记本1650显卡初始驱动
第一步,查询电脑显卡驱动信息,个人电脑显卡查询如下
第二步,若不确定下什么版本驱动,查询网站:https://www.nvidia.cn/Download/Find.aspx?lang=cn
把个人电脑显卡配置填上
如果你知道所需安装的环境的CUDA版本,可以根据cuda去找合适的显卡驱动,CUDA与显卡驱动对应关系如下:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-resolved-issues
第三步,选中符合显卡GPU的驱动下载安装,我基本上是默认的,自己设置都行,影响不大。安装完成进一步安装CUDA,但是CUDA需要对应版本才能调用显卡GPU,所以还要明确CUDA版本。版本可以通过已经安装的显卡驱动查询,右键电脑桌面空白处,打开nvidia显卡驱动面板,如下操作:
即可获得需要的CUDA版本信息,这是再去下载,基本可以确定不会下错版本,CUDA在NVIDIA官网也叫 cuda toolkit,下载网址如下:https://developer.nvidia.com/cuda-downloads
点击旧版查询入口如下,相关操作设置如下:
下载好CUDA toolkit,下一步就是安装cudnn,网址:https://developer.nvidia.com/rdp/cudnn-download
CUDA安装完(建议默认路径),cudnn下载后解压,拷贝三个文件夹至CUDA的如下安装目录覆盖,即可完成安装,
后续如果没有自动添加环境变量,需要自行添加,设置位置如下。
都安装完成后,就可以测试是否可以调用GPU了,测试代码如下,最好是包含pytorch环境的终端,结果是True就没有问题。
(pytorch) D:\>python
Python 3.7.11 (default, Jul 27 2021, 09:42:29) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
>>>
登录后复制
pytorch
gpu
cuda
nvidia
cudnn
一分钟了解规格型号
精选推荐
广告
GTX 1650桌面显卡、GTX 1660 Ti/GTX 1650笔记本显卡发布之后,NVIDIA同步放出了430.39版驱动程序...
3721阅读·0评论·0点赞
2019年5月2日
Windows11 显卡GTX1650 搭建CUDA+cuDNN环境,并安装对应版本的Anaconda和TensorFlow-GPU
6865阅读·8评论·6点赞
2021年11月25日
Win 10 版NVIDIA GeForce GTX 1060显卡驱动的下载及飞桨(Paddle)的安装
2110阅读·0评论·1点赞
2022年10月6日
笔记本gtx1650最好用驱动_各型号笔记本显卡定位
1.2W阅读·0评论·1点赞
2020年11月21日
(首个填坑)联想拯救者Y7000(自带win10 home) 安装Ubuntu16.04.6 + NVIDIA GTX1650驱动
1.3W阅读·79评论·17点赞
2019年9月22日
(ubuntu版本)快速下载NVIDIA最新显卡驱动RTX3080、GTX1650ti、CUDA11.2,CUDNN的地址
3659阅读·0评论·0点赞
2021年1月29日
恒洁奢适系列浴室柜,防水多层实木板,防水升级,不惧”芯“潮!
恒洁卫浴
广告
Ubuntu16.04:GTX1650的显卡驱动安装
2874阅读·3评论·5点赞
2021年6月27日
Ubuntu18.04+Nvidia GTX 1650 显卡驱动安装
1979阅读·0评论·0点赞
2021年12月7日
ubuntu18.04 gtx1650 快速安装nvidia显卡驱动
6321阅读·5评论·3点赞
2019年12月25日
1650 cuda版本_英伟达新卡曝光:GTX1650 GDDR6出现第三种版本,比新冠变异还快
1516阅读·0评论·0点赞
2020年12月23日
TensorFlow GPU版 GTX1650 CUDA10.0 cuDNN10.0 TensorFlow gpu1.15安装成功!
2832阅读·2评论·1点赞
2020年1月17日
ubuntu16.04+GTX1650 安装cuda,驱动会自动安装!+安装cudnn
1622阅读·0评论·1点赞
2021年3月5日
win10(GetForce GTX 1650 Ti)+cuda11.0.228+cudnn-x64-v8.0.2.39+Tensorflow-gpu2.4.1+Pytorch1.8.1(三)
2144阅读·0评论·7点赞
2021年3月31日
Ubuntu 18.04 +Nvidia gtx 1650 显卡驱动安装
6545阅读·0评论·0点赞
2019年9月7日
win10,GTX1650配置cuda10.1,cudnn7.6.5,cv2环境参考
1509阅读·0评论·1点赞
2021年8月7日
步骤如下:
1
首先,我们打开笔记本电脑,我们点击打开控制面板,
2
接下来,我们点击打开设备管理器,
3
然后,我们右击显卡,点击打开属性,
4
接着,我们点击打开上方的驱动程序选项卡,
5
最后,我们直接点击更新驱动程序按钮,就可以安装推荐驱动了。
笔记本1650显卡初始驱动:首先,我们打开笔记本电脑,我们点击打开控制面板,
?
2/5
接下来,我们点击打开设备管理器,
?
3/5
然后,我们右击显卡,点击打开属性,
?
4/5
接着,我们点击打开上方的驱动程序选项卡,
?
5/5
最后,我们直接点击更新驱动程序按钮,就可以安装推荐驱动了。
百度经验
pytorch读取的图片黄色变绿色
使用cvtColor()函数。pytorch读取的图片黄色变绿色可以使用cvtColor()函数,括号中填写green即可。PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。
Python有什么特点?
Python的特点
1. 简单
Python是一种代表简单思想的语言。
2. 易学
Python有极其简单的语法。
3. 免费、开源
Python是FLOSS(自由/开放源码软件)之一。
4. 高层语言
使用Python编写程序时无需考虑如何管理程序使用的内存一类的底层细节。
5. 可移植性
Python已被移植到很多平台,这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC。
6. 解释性
可以直接从源代码运行。在计算机内部,python解释器把源代码转换为字节码的中间形式,然后再把它翻译成计算机使用的机器语言。
7. 面向对象
python既支持面向过程编程也支持面向对象编程。
8. 可扩展性
部分程序可以使用其他语言编写,如c/c++。
9. 可嵌入型
可以把Python嵌入到c/c++程序中,从而提供脚本功能。
10. 丰富的库
Python是一种高级编程语言,具有许多特点,使其成为许多开发者和科学家首选的语言。以下是Python的一些主要特点:1. 简洁优雅:Python以简洁优雅的语法著称,使得代码易于阅读和编写。这使得Python成为学习编程的理想选择,同时也提高了代码的可维护性和可读性。2. 易学易用:相对于许多其他编程语言,Python非常容易学习和上手。它的语法简单明了,不需要大量的编码经验就可以开始编写代码。Python还提供了大量的文档、教程和资源,方便新手学习和解决问题。3. 代码可读性强:Python强调代码的可读性,追求代码的清晰和简洁。它使用了自然语言的风格和缩进来组织代码块,使得代码逻辑更加清晰明了。这使得Python代码容易理解、调试和维护。4. 跨平台性:Python是一种跨平台的语言,可以在多个操作系统上运行,包括Windows、Linux、Mac等。这使得开发者可以在不同的环境中进行开发和部署,大大提高了开发效率和灵活性。5. 强大的标准库:Python拥有丰富而强大的标准库,涵盖了各种常用的功能和工具,如文件操作、网络通信、图形界面、数据库连接等。这些库使得开发者可以直接使用现有的模块,而无需从头开始编写复杂的代码,大大加快了开发速度。6. 大量第三方库:除了标准库外,Python还拥有大量的第三方库和框架,覆盖了几乎所有可能的应用领域,如科学计算(NumPy、SciPy)、机器学习(TensorFlow、PyTorch)、Web开发(Django、Flask)和数据分析(Pandas)。这些库提供了丰富的功能和工具,使得开发者可以快速构建各种应用。7. 动态类型和自动内存管理:Python是一种动态类型语言,变量的类型是在运行时确定的,使得开发者可以更灵活地编写和调试代码。同时,Python还具有自动内存管理机制,开发者无需手动管理内存,减轻了编码的负担,提高了开发效率。8. 支持面向对象编程:Python是一种面向对象的语言,支持类、继承、多态等面向对象编程的特性。这使得开发者可以使用面向对象的思想来组织代码,提高代码的可重用性和模块化程度。9. 可扩展性:Python可以通过C/C++扩展库来提高性能,同时也支持与其他语言进行混合编程。这使得Python可以与现有的代码库和系统进行集成,提供更高效的解决方案。10. 社区支持和生态系统丰富:Python拥有庞大的社区和活跃的开发者群体,提供了丰富的资源和解决方案。Python社区充满活力,有很多开源项目和工具可以帮助开发者解决问题和提升开发效率。总的来说,Python作为一种简洁、易用且功能丰富的编程语言,具有广泛的应用领域,包括科学计算、Web开发、数据分析等。无论是初学者还是专业开发者,都可以从Python的特点中受益,并将其应用于不同的项目和领域中。
用沐神的方法阅读PyTorch FX论文
作者丨BBuf
来源丨GiantPandaCV
编辑丨极市平台
torch.fx 对于PyTorch来说确实是一个比较好的工作,因为它消除了一些动态图和静态图的Gap。比如在图改写方面, torch.fx 让PyTorch想做一些其它静态图框架的算子融合优化非常容易。并且 torch.fx 让后训练量化和感知训练量化以及AMP等的实现难度大大降低,这得益于我们可以直接在Python层操作这个IR,所以我认为这是一个不错的工作。尤其是对使用PyTorch开发的算法工程师来说,现在可以基于这个特性大开脑洞了。 torch.fx 的卖点就是,它使用纯Python语言实现了一个可以捕获PyTorch程序的计算图并转化为一个IR的库,并且非常方便的在这个IR上做Pass,同时提供将变换后的IR Codegen合法的Python代码功能。我觉得算是达到了在Eager下写Pass就像做链表插入删除题目一样顺滑。
PyTorch FX论文的链接在: https://arxiv.org/pdf/2112.08429.pdf 。
下面我就以沐神的论文阅读顺序来分享一下阅读体验,帮助大家搞清楚PyTorch FX这个特性到底是什么,以及它可以在PyTorch中发挥什么作用。
摘要部分简单指明了像PyTorch这种基于动态图执行模式的深度学习框架虽然提升了用户的易用性。但是在一些真实场景中,用户可能是需要捕获和变换程序结构(也可以直接理解为神经网络的结构)来进行性能优化,可视化,分析和硬件调优等。为了解决这个痛点,PyTorch设计了 torch.fx 这个模块来做PyTorch程序的捕获和变换,这个模块是纯Python开发的。
这一节主要是讲了一下 torch.fx 的卖点,就是说动态图虽然易用性很强,但是图结构不能被提前感知和变换,但通过这篇论文的 torch.fx 模块,这件事就成啦!
早期的图模式或者叫 define-and-run 的静态图框架有Caffe,TensorFlow等,它们设计了一个表示图的IR,用户通过调用这些框架提供的API来构建IR。然后我们可以在这个IR上做程序微分,将IR切分到设备上实现并行,量化,性能优化等等。但这些事情一般都要求开发者在领域特定的语言上去做,比如以OneFlow的静态图模式为例,要做图切分,量化,性能优化等都需要基于C++去开发,并且调试也会相对比较难(要借助pdb,gdb等等专业工具)。
现在的eager模式或者叫 define-by-run 的动态图框架有PyTorch,TensorFlow Eager模式等,它们可以随心所欲的让用户基于脚本语言编程并且可以解决大多数的训练(基于自动微分)和预测任务。但是有一些变换比如 「量化和算子融合」 是不能直接做的,而这一点在静态图模式下则很简单。为了消除这种Gap,动态图框架需要一种从用户的程序捕获图结构的方法来使能这些变换。
在捕获和变换程序时,eager和graph模式的深度学习框架都必须在 「捕获程序结构」 、 「程序特化」 和 「保存程序的IR的设计」 方面做出选择。这些选择的组合决定了可在框架中表示的 「程序空间」 、 「编写变换的难易程度」以及「生成的变换程序的性能」 。 「一般来说,支持程序的高性能运行需要更复杂的捕获框架和IR,从而使转换更难编写」 。每一段相关工作我就不详细过了,只描述每一段工作的核心是在说什么,相关细节大家可以查看原始论文。
这一节提到了PyTorch的 jit.trace ,MxNet Gluon,TensorFlow的 tf.function 等程序捕获方法,并指出这些方法只能处理Python的一些子集。然后,TorchScript通过在AST上分析可以处理控制流和更多的Python语法。然后还提了一下Julia和Swift For TensorFlow中将捕获程序结构的接口集成到了非Python的宿主语言中,要使用的话需要用户放弃Python生态系统。
对于 a+b 这个Python语句来说,这个表达式对 a 和 b 的类型没有限制。但当深度学习框架捕获程序时一般会对这两个变量进行特化,以便它们只对特定类型或者张量有效。在深度学习框架中处理的大多数程序都是特化类型的程序,特化程度越高,能够处理的输入就越少。例如 torch.jit.trace 在执行trace的时候只能处理某些拥有合法输入shape的输入。接下来还讨论了LazyTensor和Jax的 jit 来说明为了更好的处理特化程序中捕获的失败,它们做了哪些努力。
深度学习框架都有自己的IR设计,Caffe和TensorFlow使用Protocol Buffers格式。而PyTorch和MxNet使用C++数据结构来表示IR并额外绑定到Python。这些IR设计在runtime阶段表现都会比较好并且可以统一被序列化。但从另外一个角度来说,这些IR表示相比于纯Python语言的表示都需要更高的学习成本。接下来,这一节讨论了控制流和状态的问题,用来表明要处理这些问题需要设计较为复杂的IR以及要基于这个IR做较为复杂的分析才行。
基于上面几点,论文提出了 torch.fx 的基本设计原则:
这一节主要对一些相关工作进行了展开,以此来突出 torch.fx 的核心卖点,就是说我虽然不能像TorchScript这样的IR处理一些比较难的Case(比如动态控制流),但是我在神经网络这个领域里做得够用就可以了。最关键的是我的实现很简单,是纯Python的库,这样用户写变换就会很简单,学习成本会很小并且易用。(简单不代表不强大!
以简单为基本原则, torch.fx 通过符号跟踪来捕获程序,并通过一个简单的6个指令的IR来表示它们,并基于这个IR重新生成Python代码来运行它。为了避免JIT特化中的重捕获的复杂性, torch.fx 没有对程序本身进行特化,而是依靠变换来决定在捕获期间需要实现哪些特化。用户也可以配置符号跟踪的过程来实现自定义捕获需求。
Figure1给我们展示了使用 torch.fx.symbolic_trace 捕获程序的例子,输入可以是一个 torch.nn.Module 或者函数,并且捕获之后的结构被存在一个Graph对象里面。该 Graph 对象和 GraphModule 中的模块参数相结合, GraphModule 是 torch.nn.Module 的子类,其 forward 方法运行捕获的 Graph 。我们可以打印此图的 Nodes 以查看捕获的 IR。 placeholder 节点表示输入,单个 output 节点表示 Graph 的结果。 call_function 节点直接引用了它将调用的 Python 函数。 call_method 节点直接调用其第一个参数的方法。 Graph 被重组为 Python 代码( traced.code )以供调用。
Figure2展示了使用 torch.fx 进行变换的示例。变换是找到一个激活的所有实例并将它们替换为另一个。在这里,我们使用它来将 gelu 替换 relu 。
torch.fx 的符号跟踪机制使用一个Proxy数据结构来记录给定一个输入之后经过了哪些Op。Proxy是一个duck-typed类型的Python类记录了在它之上的的属性访问和调用方法,是程序中真实Op的上层抽象。duck-typed可以看一下这里的介绍: https://zh.wikipedia.org/wiki/%E9%B8%AD%E5%AD%90%E7%B1%BB%E5%9E%8B 。PyTorch的算子以及Python子集的某些函数都会被这个Proxy包装一次,然后在符号跟踪传入的是一个 nn.Module 时,会对这个 nn.Module 中的子 nn.Module 也进行Proxy包装,当然还包含输入数据。这样程序中的输入和其它Op都是duck-typed类型的Proxy对象,我们就可以执行这个程序了,也就是符号跟踪的过程。符号跟踪的过程通过一个 Tracer 类进行配置,它的方法可以被重写以控制哪些值被作为Proxy对象保留,哪些值被unpack。(Proxy记录下来的Op可以进行unpack,unpack之后可以拿到真实的Tensor, Parameter和运算符等等)。通过Proxy和Tracer类的配合, torch.fx 就可以完成PyTorch程序的符号跟踪,需要注意的是这里的符号跟踪的意思就是运行一遍这个被代理之后的 nn.Module 的forward。
torch.fx 的中间表示(IR)由一个Python数据结构 Graph 来做的。这个 Graph 实际上是一个包含一系列 Node 的线性表。节点有一个字符串操作码 opcode ,描述节点代表什么类型的操作(操作码的语义可以在附录 A.1 中找到)。节点有一个关联的目标,它是调用节点( call_module 、 call_function 和 call_method )的调用目标。最后,节点有 args 和 kwargs ,在trace期间它们一起表示 Python 调用约定中的目标参数(每个opcode对应的 args 和 kwargs 的语义可以在附录 A.2 中找到)。节点之间的数据依赖关系表示为 args 和 kwargs 中对其他节点的引用。
torch.fx 将程序的状态存储在 GraphModule 类中。 GraphModule 是转换程序的容器,暴露转换后生成的代码,并提供 nn.Module 类似的参数管理APIs。 GraphModule 可以在任何可以使用普通的 nn.Module 的地方使用,以提供转换后的代码和PyTorch 生态系统的其余部分之间的互操作性。
torch.fx 变换pipline的最后阶段是代码生成。 torch.fx 并不是退出 Python 生态系统并进入定制的运行时,而是从变换后的 IR 生成有效的 Python 源代码。然后将此变换后的代码加载到 Python 中,生成一个可调用的 Python 对象,并作为 forward 方法安装在 GraphModule 实例上。使用代码生成允许将 torch.fx 变换的结果安装在模型中并用于进一步的变换。例如,在图3中,我们拿到trace原始程序的结果并将其安装为新模块中的激活函数。
到这里PyTorch FX特性就精读完了,但查看FX的论文可以发现还有一节叫作Design Decisions,分别介绍了Symbolic Tracing,Configurable Program Capture,AoT Capture without Specialization,Python-based IR and Transforms等等FX实现中依赖的一些想法和 决策,以及它们的好处等。我理解这一节就是Introduction的加强版,所以就不继续讲解这一小节了,如果你担心会错过什么细节知识可以阅读论文原文。
torch.fx 的一个目标就是简化深度学习模型产生的IR,下面的Figure5以ResNet50为例展示了TorchScript IR和 torch.fx IR的差别,相比于TorchScript IR, torch.fx IR确实简单并且可读性更强。
我们知道后量化以及量化感知训练可以提示程序推理时的性能,下面的Figure6就展示了基于 torch.fx 实现的后量化(使用FBGEMM量化算子)应用在DeepRecommender模型之后,在Intel Xeon Gold 6138 CPU @2.00GHz上的性能表现。基于 torch.fx 实现的后量化模型推理速度相比float类型的模型要高3.3倍。并且基于 torch.fx 实现量化操作相比基于TorchScript IR要简单很多。
torch.fx 还可以做Op融合,Figure7展示了基于 torch.fx 做了Conv+BN融合后应用在ResNet50上,在n NVIDIA Tesla V100-SXM2 16GB with CUDA version 11.0 和 Intel Xeon Gold 6138 CPU @ 2.00GHz的性能表现,可以看到在GPU上减少了约6%的latency,在CPU上减少了约40%的latency(多线程)和约18%的latency(单线程)。
除此之外 torch.fx 还可以应用在FLOPs计算,内存带宽使用分析,工作负载的数据值大小估计等,用来分析程序运行时的内存和速度。 torch.fx 还可以用在形状推断,以及模型对应的DAG可视化作图等等。
最后, torch.fx 在runtime阶段还支持通过ASIC加速(即将 torch.fx 中的算子lowering到对应的ASIC上),下面的Figure8展示了基于 torch.fx 推理ResNet50和LearningToPaint并将算子lowering到TensorRT之后的加速情况:
torch.fx 对于PyTorch来说确实是一个比较好的工作,因为它消除了一些动态图和静态图的Gap。比如在图改写方面, torch.fx 让PyTorch想做一些其它静态图框架的算子融合优化非常容易。并且 torch.fx 让后训练量化和感知训练量化以及AMP等的实现难度大大降低,这得益于我们可以直接在Python层操作这个IR,所以我认为这是一个不错的工作。尤其是对使用PyTorch开发的算法工程师来说,现在可以基于这个特性大开脑洞了。我之前围绕FX也做了一个QAT的工作,感兴趣可以阅读:基于OneFlow实现量化感知训练: https://zhuanlan.zhihu.com/p/397650514
最后总结一下, torch.fx 的卖点就是,它使用纯Python语言实现了一个可以捕获PyTorch程序的计算图并转化为一个IR的库,并且非常方便的在这个IR上做Pass,同时提供将变换后的IR Codegen合法的Python代码功能。我觉得算是达到了在Eager下写Pass就像做链表插入删除题目一样顺滑。
沐神的论文阅读方法,感觉确实比较科学,文章末尾再赞一次。