Koila解决了
CUDA error: out of memory error。仅使用一行代码修复它,然后忘记它。

主分支是对项目的完整重新结构(由于我没有足够的时间完成该项目,目前大部分是空的)。要查看工作代码,请查看v0.1.1标签以获取概念证明(这对所有操作都没有全部支持,并且不适合生产)。要使用它,请在此处下载版本v0.1.1。
?防止CUDA error: out of memory error 。
⚗️当批处理大小太大时会自动累积梯度。
?懒惰地评估Pytorch代码以节省计算能力。
✂️将沿批处理尺寸自动拆分至更多的GPU友好数字(2的功率),以加快执行速度。
?最小的API(包装所有输入就足够了)。
曾经遇到过RuntimeError: CUDA error: out of memory ?我们都喜欢PyTorch因为它的速度,效率和透明度,但这意味着它不会做额外的事情。自2017年以来,诸如防止非常常见的错误一直困扰着许多用户的事情。
该图书馆旨在通过成为本地PyTorch轻巧包装器来防止这种情况。包装张量时,库会自动计算剩余的GPU内存的量并使用正确的批次大小,从而使每个人都不得不在使用模型时手动调整批处理大小。
此外,库会自动将正确的批量大小用于GPU。您是否知道使用较大的批次并不总是加快处理的加速处理?它也是在此库中自动处理的。
因为Koila代码是PyTorch代码,因为它在引擎盖下运行PyTorch时,您可以一起使用两者而不担心兼容性。
哦,所有这些都在1行代码中! ?
Koila可在PYPI上使用。要安装,请运行以下命令。
pip install koila用法很简单。例如,您有以下PyTorch代码(从PyTorch的教程复制)
定义输入,标签和模型:
# A batch of MNIST image
input = torch . randn ( 8 , 28 , 28 )
# A batch of labels
label = torch . randn ( 0 , 10 , [ 8 ])
class NeuralNetwork ( Module ):
def __init__ ( self ):
super ( NeuralNetwork , self ). __init__ ()
self . flatten = Flatten ()
self . linear_relu_stack = Sequential (
Linear ( 28 * 28 , 512 ),
ReLU (),
Linear ( 512 , 512 ),
ReLU (),
Linear ( 512 , 10 ),
)
def forward ( self , x ):
x = self . flatten ( x )
logits = self . linear_relu_stack ( x )
return logits定义损失函数,计算输出和损失。
loss_fn = CrossEntropyLoss ()
# Calculate losses
out = nn ( t )
loss = loss_fn ( out , label )
# Backward pass
nn . zero_grad ()
loss . backward ()好的。如何调整代码以使用Koila的功能?
您添加此代码行(从v0.1.1开始):
# Wrap the input tensor and label tensor.
# If a batch argument is provided, that dimension of the tensor would be treated as the batch.
# In this case, the first dimension (dim=0) is used as batch's dimension.
( input , label ) = lazy ( input , label , batch = 0 )完毕。您不会再用完记忆了。
CUDA error: out of memory通常发生在正向通行中,因为需要将临时变量保存在内存中。
Koila是PyTorch周围的薄包装纸。它的灵感来自Tensorflow的静态/懒惰评估。首先构建图形并仅在必要时运行模型,该模型必须访问所有信息,以确定计算模型的真正资源。
在内存使用方面,仅需要临时变量的形状来计算模型中使用的那些变量的存储使用情况。例如, +接收两个张张量相等的张量,并输出一个等于输入尺寸的张量,并log一个张量,并输入一个张量,并输出另一个具有相同形状的张量。广播使它比这更复杂,但是一般的想法是相同的。通过跟踪所有这些形状,人们可以轻松地确定在向前传球中使用了多少内存。并相应地选择最佳批量尺寸。
不。确实,计算形状并计算大小和内存使用情况听起来像是很多工作。但是,请记住,即使像GPT-3这样的巨大模型(具有96层),其计算图中只有几百个节点。由于Koila的算法在线性时间内运行,因此任何现代计算机都可以立即处理图形。
大多数计算都用于计算单个张量和跨设备传输张量。请记住,这些支票无论如何都会发生在香草PyTorch中。所以不,一点也不慢。
该项目最初被称为世界上最懒惰的物种考拉(Koala ),该项目是关于张量子的懒惰评估。但是,由于该名称是在PYPI上取的,所以我别无选择,只能使用其他名称。 Koila是我组成的一个词,发音与Voila (这是法语单词)相似,所以听起来像Koala。
如果您喜欢所看到的,请考虑给这颗星(★)!
尽管互联网上有很多类似的图书馆,但我为什么要遇到麻烦并建立该项目?
批量搜索不是新的。实际上,强大的流行闪电具有它。
Lightning的批量搜索已深入整合到其自己的生态系统中。您必须使用其模型中的DataLoader程序,子类,并相应地训练模型。虽然对使用闪电的重构监督学习任务相对容易,但使用加固学习代码基础进行同样的事情确实很痛苦,在这种情况下,必须与环境互动。
相比之下,由于Koila是超级轻量级的Pytorch包装纸,因此在Pytorch工作时起作用,因此可以为现有代码提供最大的灵活性和最小的更改。
但是,请注意,在您编写新代码的情况下,建议使用闪电,因为它可以实施更好的代码样式模式,从长远来看将有益于模块化。
同样,通过一个空张量来构建计算图(又称静态图)并不是一个新想法,而是在流行的TensorFlow库中进行详尽的探索,以及类似的PyTorch包装库库。这些图书馆遭受了这样一个事实的困扰,即在其中调试程序是不必要的复杂的。例如, TensorFlow以其易于部署而闻名,但开发疼痛,以至于用户切换到PyTorch 。在调试期间,人们喜欢查看变量内部的内容,以查看它是否包含不正确的值。但是,由于静态图仅定义关系,因此未计算值,从而使调试变得困难。
Koila通过在转换为字符串,整数或任何Python值时急切地评估这一点。这使得无缝调试可以在保持执行内存管理的能力的同时根本不可用于更直接的PyTorch程序,该程序(在需要时)(需要)动态地分配并自由地分配内存。
Tensor S和LazyTensor S之间的相互作用)。该代码在许多情况下都可以使用,但仍在进行中。由于时间有限,这还不是(尚未)完全PyTorch的库。避免在生产环境中使用它!
开放性和包容性非常重视。该代码可在Apache许可证下获得。请遵循以下行为准则。