于昼夜

西郊有密林,
助君出重围✨

PyTorch内存管理:Caching Allocator(二)一文读懂Block

前言 PyTorch内存管理:Caching Allocator 的第一部分是对PyTorch内存管理的基本情况的概括。这篇文章讲从代码入手,尝试理解PyTorch Caching Allocator 中最核心的数据结构:Block,以及它在实际内存分配中是如何被管理的。 Block 先通过代码看看它的定义: struct Block { c10::DeviceIndex device; // gpu cudaStream_t stream; // allocation stream stream_set stream_uses; // streams on which the block was used size_t size; // block size in bytes size_t requested_size; // memory originally requested BlockPool* pool{nullptr}; // owning memory pool void* ptr{nullptr}; // memory address bool allocated{false}; // in-use flag bool mapped{true}; // is the virtual address range this Block references // backed by physical pages. Always true when // expandable_segment_ is null. When false // This Block will be aligned to the segment size // of its expandable_segment_. Block* prev{nullptr}; // prev block if split from a larger allocation Block* next{nullptr}; // next block if split from a larger allocation int event_count{0}; // number of outstanding CUDA events int64_t gc_count_base{0}; // get_free_blocks_call_count when Block is inserted std::shared_ptr<GatheredContext> context_when_allocated; // only set for the first block in the segment (when prev == null) // this records the frame information when cudaMalloc was called // whereas context_when_allocated records the last time we handed this // memory out from our cache. std::shared_ptr<GatheredContext> context_when_segment_allocated; ExpandableSegment* expandable_segment_{nullptr}; device、size、ptr:这几个参数比较好理解,由于是内存管理,就一定需要涉及到分配的设备、分配的内存大小以及在设备上的地址; requested_size:分配时请求的实际大小; stream:代表分配时的stream,默认所有操作会在该流进行; stream_uses:使用多流时记录使用过的流; prev、next:说明Block本质是一个链表,这也是为什么可以很方便的在Block内部执行切分、重组操作; event_count:未完成的cuda_event计数; 还剩一些涉及到虚拟内存、可扩展段以及资源管理的描述,我们放到后文去深究。总之,这几个属性就已经决定了如何申请、释放一个block,以及存在异步冲突怎么解决。 ...

February 8, 2026 · 3 min · 579 words · YuZhouye · 

电子产品的长期主义

刚刚完成学生到职场的身份转变————本质上是收入来源从父母到自己的转变,我开始回过头来review自己的消费观。以及,什么样的产品,能叫具有长期主义的电子产品。 作为一个学生而言,除了钱什么都不缺,我有的是时间和精力还有热情去做自己想做的事情,就拿手机举例,我会买小米手机————以一个较低的价格获取更好的硬件,然后去尝试给它刷各种系统、尝试解除温控、尝试root+探索。总而言之,是用时间(你要付出时间精力去学习理解参数并选择)换取金钱。 聊聊我的电子产品:2018,伴随着入学季,老妈为我购买了一台戴尔G3笔记本,iPad是哥哥给我的高考超过600分的奖励,另外一个电子产品是高中时期的红米手机。当然,这么多年过去了,手机已经不知道换了多少部,戴尔G3虽然也没有更换,但它的稳定性太差了,在它身上也没少折腾,拆机、清灰、换风扇、加内存条,现在不到必须使用window的情况下,我一般也不会打开它。至于这台iPad,3000块,七年过去了,二手市场的均价仍然在500块。虽然是非全贴合屏幕+60hz,但他对我产生过一些影响。本科的时候用这台iPad和一只Apple Pencil写下了无数的课堂笔记,至今做笔记这个功能它仍然可以满足我,当然,除此之外,现在它的作用也只有作为连接蓝牙的音乐播放器和电纸书了。我潜意识里认为的这台iPad是性价比最高的产品,原因应该是 它曾经足够好用 它现在依旧能基本满足作为一台平板的功能 它足够稳定,我几乎不需要考虑维修和折腾,充好电,它就可靠 它为我的成长做出过一些贡献 我现在慢慢觉得,一个你经常会用到的东西,它必须足够稳定和优秀,才能降低你对自身时间和精力的浪费,本质上,是用金钱换取为数不多的时间和精力了。我最近很喜欢的电子产品是Airpods Pro3,也是我终于舍得狠下心尝试的一款产品。我读书的时候也买过降噪耳机,Vivo TWS 3,降噪的确还算强,但是当时没有做足功课,它的音质我只能用垃圾形容,但我还是使用了它相当长的一段时间。直到我购买了Airpods Pro3,第一次戴上它我的脑海里只有震惊,给不接触电子产品的女朋友体验后,她说你在路上的时候千万不要戴它,注意安全。现在,它已经成为我上班时必备的工具之一了,我总是在想,如果上学时狠狠心购买的是Airpods Pro2就好了。一千块,其实几乎不会改变我的生活,但体验往往是截然不同的。 现在,对于电子产品的选购,我的买点: 稳定,一个产品稳定与否,取决于开发团队的态度,也决定了这个产品的生命周期 短期足够好用,长期能提供它作为该类型产品的基本功能 价格并不代表价格,贬值率才代表价格

February 7, 2026 · 1 min · 18 words · YuZhouye · 

迷茫与长期主义

时常感到焦虑,焦虑的来源是迷茫,是对未来生活的不确定性。但是有一些事情可以贯穿时间,在更长的跨度范围内给予一个人在某方面甚至整体上的成长,这就是长期主义。 想一下在我的视角里可以被称之为长期主义的事情:读书,电影(我指的是已经经过时间考验的经典的作品),投资(观念、认知、知识广度),音乐(一件乐器),以及我现在在做的事情(复盘、总结、记录)。但这些事情往往很花时间,而且是完整的大块时间,而不是碎片化的垃圾时间。 于我而言,这两件反而是相互矛盾的事情,正是因为它足够长期,反而使我无法从中获得积极的反馈。我知道我需要做一些长期的事情,但是时间和精力被工作挤满后,想做的事情只能一拖再拖。 但是我又好奇,如果我真的做了这些事情,它一定切切实实地会给予我回报吗?或者从概率的角度出发,它大概率会给予我一个正向的回报吗?如果答案是yes,那为什么不放弃工作,而专心于这几件长期的事情?如果答案是no,那它们还是长期主义的事情吗?

February 7, 2026 · 1 min · 4 words · YuZhouye · 

PyTorch内存管理:Caching Allocator(一)

概述 当Pytorch显存溢出时,通常会抛出如下的错误: torch.OutOfMemoryError: CUDA out of memory. Tried to allocate xxxx MB. GPU 0 has a total capacity of xxxx GiB of which xxxx bytes is free. Of the allocated memory xxxx GiB is allocated by PyTorch, and xxxx MB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) 阅读本文,你将理解下面这句报错中的显存大小 GPU 0 has a total capacity of xxxx GiB of which xxxx bytes is free 和下面这句报错中的显存大小的关系 ...

January 31, 2026 · 2 min · 318 words · YuZhouye · 

个人博客搭建指南-基于Hugo和Github Pages

概述 基于Hugo和Github Pages搭建个人博客是一件非常成熟简单的事情,你不需要看懂html和css源码,只需要修改几个配置就可以搭建出一个静态页面。你可以通过这里来查看我基于这套框架搭建的个人网站。 最近,我关注的PyTorch大神ezyang也将个人博客迁移至hugo,ezyang’s blog, 说明它足够稳定和强大。 理论上,只需要几十分钟就可以实现整个博客的搭建, 我参考的视频教程。 安装hugo 以macos为例,需要先安装homebrew和git,之后参考官方指南 brew install hugo cd ~/Desktop hugo new site blogs 此时桌面下就生成了blogs目录,当然,你可以自定义它要存放的位置。 安装主题 以papermod主题为例: cd blogs/themes git clone https://github.com/adityatelange/hugo-PaperMod.git 你可以修改 blogs 下的hugo.yml或者叫hugo.toml, 设置theme = “PaperMod” 你可以参考这个示例文件来配置你的网站 例如,你可以通过[params]来控制是否显示阅读时间、是否打开评论区、时间样式、作者等等等等,你甚至可以直接把文件丢给Gemini来帮你快速完成你想要的样式。 你可以通过[params.homeInfoParams]来控制主页标识,通过[[menu.main]]来管理你的菜单栏。 预览 在 blogs/content下添加一个md文件,例如: --- title: "About" layout: "single" url: "/about/" summary: "about YuZhouye" --- 内容 在blogs目录下执行hugo server就可以预览,你可以访问本地端口http://localhost:1313/来实时查看你的修改 创建Github Pages 在github下新建一个项目,通常是你的用户名.github.io,在终端执行: hugo --baseUrl="你的用户名.github.io" 此时会生成一个public文件夹,你在blogs下的修改,hugo会帮你在public下生成对应的html文件,此时只需要将文件夹与你的Github Pages绑定即可。 cd public git init # 连接你的项目 git xxxx git add . git commit -m'xxx' git push -u origin main push前,你可以执行hugo --cleanDestinationDir,以清理缓存。 此时需要等待Github Pages部署,稍过几分钟就可以通过访问你的用户名.github.io来访问你的个人博客了。 ...

January 16, 2026 · 1 min · 115 words · YuZhouye ·