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許可證下獲得。請遵循以下行為準則。