PyTorch的全貌在一页上
损失,死亡,机器人,部分 0 地图(此部分)张量自动求导 每日PyTorch 查看PyTorch 机器 扩展PyTorch 编译器 内核与硬件 分布式发货 在PyTorch上工作 PyTorch的全貌在一页上。 2026年8月7日 36分钟 秋天 领土 十二个想法 本系列如何引导 如何阅读这个 你现在可以说什么 亲自尝试 选择一扇门 参考 文献 目录 秋天 领土 十二个想法 本系列如何引导 如何阅读这个 你现在可以说什么 亲自尝试 选择一扇门 参考 图1. 本系列涉及的程序。 你已经输入过类似的内容千次。 本系列的存在是为了让你在结束时了解这些行的所有作用。 所有这些:它们接触的Python,它们落入的C++,它们记录的图表,它们选择的内核,它们使用的内存,以及它们运行的两个时钟。 每个词都在其下的地面上有一个明确的含义。 这是第0部分,地图。 首先我们快速地通过所有层一次。 然后绘制领土。 然后是十二个使其余代码库可预测的想法。 然后是这个系列是如何运作的,以及如何阅读它。 这里没有任何东西得到了完整的故事。 这里的一切都占据一个位置,每个完整的故事都有一个编号的部分在等待它。 开始之前的一个承诺。 本系列中的每个测量数字来自一个小脚本,你可以自己运行,链接就在数字出现的地方。 我是在一台配备torch 2.11.0的Apple M3 Max笔记本上测量的 [ 1 ] 。 你的数字会有所不同。 它们所形成的模式却不会。 秋天 PyTorch是深邃的。 在你的键盘和芯片之间有八个层次。 我将把它们称为楼层,这个仪表显示了它们的全部。 它贯穿整个系列,因此你总是知道自己有多深。 图2. 深度计。 橙色点标记你所在的位置。 学习一栋建筑物最快的方式是一次性快速经过它。 这就是本节的内容。 第一层:python torch.randn看起来像一个Python函数。 问Python它实际上是什么: >>> type ( torch . randn ) <class ' builtin_function_or_method ' > Python只将该类型赋予编译代码中编写的函数。 编译代码意味着:在你安装它之前就已被翻译为机器指令的代码,因此其中没有Python主体可以读取,也没有行让你的调试器停下来。 那么那些机器指令在哪里呢? 在共享库中。 共享库是一个编译代码的文件,程序在运行时加载它。 他们存放在你磁盘上的torch包内,你可以查看它们(证据): torch._C -> _C.cpython-312-darwin.so(49 KB,加载器) libtorch_cpu.dylib 206.5 MB(张量和内核) libtorch_python.dylib 28.5 MB(边界的python部分) p0_the_library.py 证据,准备好阅读或运行。 """ 证据:PyTorch的编译部分实际存在的位置。 torch._C是一个薄编译存根;框架的权重在它旁边的共享库中。 打印文件及其大小。 """ import glob import os import torch stub = torch . _C . __file__ print ( f "torch { torch . __version__ } " ) print ( f "torch._C -> { os . path . basename ( stub ) } " f "( { os . path . getsize ( stub ) / 1024 :.0f } KB stub)" ) libdir = os . path . join ( os . path . dirname ( stub ), " lib " ) for lib in [ " libtorch_cpu.dylib " , " libtorch_python.dylib " ]: p = os . path . join ( libdir , lib ) if os . path . exists ( p ): print ( f " { lib :24s } { os . path . getsize ( p ) / 1024 / 1024 :6.1f } MB" ) 下载并运行它。 查看文件大小,然后查看它们: 图3. 按文件大小按比例绘制的。 Python可以看到的PyTorch部分是橙色点。 你可以从Python看到的PyTorch部分是一个49 KB的文件,其唯一的工作就是加载其他两个。 真正的主体是235 MB的编译代码。 import torch将其引入你的进程,此后,调用torch.randn意味着跳入该主体。 今天我们只需要知道这些文件存在。 这是代码库的第一个真正惊喜:你整天编写的Python是它的最小层。 边界 调用立即离开Python。 它落在哪儿? 在一个名为THPVariable_randn的C++函数中,位于上一个楼层的28.5 MB库内。 你可以记住一个奇怪的事实:这个函数在PyTorch代码库中并不存在。 克隆repo,搜索名称,你会发现什么也没有。 一个程序在构建过程中写入这个函数,与其数千个兄弟一起。 下面的想法4解释了为什么,而第5部分展示了执行写入的程序。 图4. 两种语言之间的边界。 每个张量操作都会跨越它。 跨越这一边界需要时间。 仅仅要看成本,给最小的操作计时,其中几乎没有算术隐藏它(证据): add,1个元素:每次调用0.538微秒 add,4M个元素:每次调用337.264微秒 p2_dispatch_cost.py 证据,准备好阅读或运行。 """ 证据:一个急切操作的固定成本,以及为什么规模...
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡