1行代码消除PyTorch的CUDA内存溢出报错,这个GitHub项目刚发布就揽星600+

2021 年 12 月 18 日 量子位
丰色 发自 凹非寺
量子位 报道 | 公众号 QbitAI

CUDA error: out of memory.

多少人用PyTorch“炼丹”时都会被这个bug困扰。

一般情况下,你得找出当下占显存的没用的程序,然后kill掉。

如果不行,还需手动调整batch size到合适的大小……

有点麻烦。

现在,有人写了一个PyTorch wrapper,用一行代码就能“无痛”消除这个bug。

有多厉害?

相关项目在GitHub才发布没几天就收获了600+星。

一行代码解决内存溢出错误

软件包名叫koila,已经上传PyPI,先安装一下:

pip install koila

现在,假如你面对这样一个PyTorch项目:构建一个神经网络来对FashionMNIST数据集中的图像进行分类。

先定义input、label和model:

# A batch of MNIST image
input = torch.randn(82828)

# A batch of labels
label = torch.randn(010, [8])

class NeuralNetwork(Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = Flatten()
        self.linear_relu_stack = Sequential(
            Linear(28 * 28512),
            ReLU(),
            Linear(512512),
            ReLU(),
            Linear(51210),
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

然后定义loss函数、计算输出和losses。

loss_fn = CrossEntropyLoss()

# Calculate losses
out = nn(t)
loss = loss_fn(out, label)

# Backward pass
nn.zero_grad()
loss.backward()

好了,如何使用koila来防止内存溢出?

超级简单!

只需在第一行代码,也就是把输入用lazy张量wrap起来,并指定bacth维度——

koila就能自动帮你计算剩余的GPU内存并使用正确的batch size了。

在本例中,batch=0,则修改如下:

input = lazy(torch.randn(82828), batch=0)

完事儿!就这样和PyTorch“炼丹”时的OOM报错说拜拜。

灵感来自TensorFlow的静态/懒惰评估

下面就来说说koila背后的工作原理。

“CUDA error: out of memory”这个报错通常发生在前向传递(forward pass)中,因为这时需要保存很多临时变量。

koila的灵感来自TensorFlow的静态/懒惰评估(static/lazy evaluation)

它通过构建图,并仅在必要时运行访问所有相关信息,来确定模型真正需要多少资源。

而只需计算临时变量的shape就能计算各变量的内存使用情况;而知道了在前向传递中使用了多少内存,koila也就能自动选择最佳batch size了。

又是算shape又是算内存的,koila听起来就很慢?

NO。

即使是像GPT-3这种具有96层的巨大模型,其计算图中也只有几百个节点。

而Koila的算法是在线性时间内运行,任何现代计算机都能够立即处理这样的图计算;再加上大部分计算都是单个张量,所以,koila运行起来一点也不慢。

你又会问了,PyTorch Lightning的batch size搜索功能不是也可以解决这个问题吗?

是的,它也可以。

但作者表示,该功能已深度集成在自己那一套生态系统中,你必须得用它的DataLoader,从他们的模型中继承子类,才能训练自己的模型,太麻烦了。

koila灵活又轻量,只需一行代码就能解决问题,非常“大快人心”有没有。

不过目前,koila还不适用于分布式数据的并行训练方法(DDP),未来才会支持多GPU

以及现在只适用于常见的nn.Module类。

ps. koila作者是一位叫做RenChu Wang的小哥。

项目地址:
https://github.com/rentruewang/koila

参考链接:
https://www.reddit.com/r/MachineLearning/comments/r4zaut/p_eliminate_pytorchs_cuda_error_out_of_memory/

本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

「智能汽车」交流群招募中!

欢迎关注智能汽车、自动驾驶的小伙伴们加入社群,与行业大咖交流、切磋,不错过智能汽车行业发展&技术进展。

ps.加好友请务必备注您的姓名-公司-职位哦~


点这里👇关注我,记得标星哦~

一键三连「分享」、「点赞」和「在看」

科技前沿进展日日相见~


登录查看更多
1

相关内容

【干货书】PyTorch实战-一个解决问题的方法
专知会员服务
143+阅读 · 2021年4月2日
专知会员服务
90+阅读 · 2020年12月26日
Linux导论,Introduction to Linux,96页ppt
专知会员服务
76+阅读 · 2020年7月26日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【GitHub实战】Pytorch实现的小样本逼真的视频到视频转换
专知会员服务
35+阅读 · 2019年12月15日
实践教程 | 浅谈 PyTorch 中的 tensor 及使用
极市平台
1+阅读 · 2021年12月14日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
手把手教你入门深度强化学习(附链接&代码)
THU数据派
75+阅读 · 2019年7月16日
用PyTorch做物体检测和追踪
AI研习社
12+阅读 · 2019年1月6日
Github 项目推荐 | YOLOv3 的最小化 PyTorch 实现
AI研习社
25+阅读 · 2018年5月31日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
ResT V2: Simpler, Faster and Stronger
Arxiv
0+阅读 · 2022年4月15日
Arxiv
11+阅读 · 2019年6月19日
Arxiv
25+阅读 · 2017年12月6日
VIP会员
相关资讯
实践教程 | 浅谈 PyTorch 中的 tensor 及使用
极市平台
1+阅读 · 2021年12月14日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
手把手教你入门深度强化学习(附链接&代码)
THU数据派
75+阅读 · 2019年7月16日
用PyTorch做物体检测和追踪
AI研习社
12+阅读 · 2019年1月6日
Github 项目推荐 | YOLOv3 的最小化 PyTorch 实现
AI研习社
25+阅读 · 2018年5月31日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
相关基金
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员