在某些情況下,更快的固定cpu張量<-> gpu pytorch variabe轉移和gpu張量<-> gpu pytorch變量轉移。
由於對於某些系統,使用固定的Pytorch CPU張量要比使用Cupy Tensor的速度快(有關詳細信息,請參見“如何工作”部分),我創建了一般的Pytorch張量類別PytorchModelFactory和PytorchOptimizerFactory ,並且可以將張緊器設置為cuda or cuda或cpu ,如果要使用cpu ,以及如果使用cpu cuda或cpu。原始的GPUPytorchModelFactory和GPUPytorchOptimizerFactory類仍在庫中,因此不應影響使用Speedtorch的現有代碼。該文檔已更新以包括這些新類。
該庫圍繞固定在CPU上的CUPY TESOR進行了旋轉,與常規Pytorch固定的CPU Tensors可以達到3.1倍的CPU - > GPU傳輸,並且更快的GPU - > CPU傳輸速度更快。速度取決於系統上的數據量和CPU內核數(有關更多詳細信息,請參見其工作方式)
圖書館包括用於嵌入培訓的功能;它可以在閒置時將嵌入在CPU RAM上,保留GPU RAM。
我最初創建了這個庫來幫助訓練大量嵌入,GPU可能在RAM中持有困難。為了做到這一點,我發現,通過託管CPU上的一些嵌入可以幫助實現這一目標。嵌入系統使用Sprase培訓;總計量列的只有一部分參與向前/更新步驟,其餘的都是空閒的。所以我想,為什麼不在訓練步驟中將空閒參數遠離GPU呢?為此,我需要快速的CPU-> GPU轉移。
有關完整的背景故事,請參閱“ DevPost”頁面
https://devpost.com/software/speedtorch-6w5unb
使用快速的CPU-> GPU,可以為功能開發許多有趣的方法,以前人們認為這可能是不可能的。
?將Speedtorch納入您的數據管道中,以進行快速數據傳輸到CPU <-> GPU
? 通過CPU存儲增加培訓參數。只要您有足夠的CPU RAM,就可以託管任何數量的嵌入,而不必擔心GPU RAM。
?瀏覽量使用Adadelta,Adamax,RMSprop,Rprop,Asgd,Adamw和Adam優化器進行稀疏嵌入式培訓。以前,只有Spraseadam,Adagrad和SGD是適當的,因為僅這些直接支持稀疏梯度。
(編輯9-20-19,Pytorch開發人員之一指出了原始基準代碼中的一些小錯誤,值和代碼已更新)
這是一個筆記本,該筆記本比較了通過Speedtorch與Pytorch張量的轉移,並固定了CPU和CUDA張量。所有測試均使用帶有Tesla K80 GPU的COLAB實例和2個Core CPU進行。
更新10-17-19:Google Colab現在是標準配置4個核心CPU的標準配置,因此該筆記本將給出與以下報告不同的結果,因為隨著CPU內核的增加,Pytorch的索引內核變得更加有效。
https://colab.research.google.com/drive/1pxhbmbzqtiq_nlfguianpf_mfpiqskks
本筆記本次數times的數據傳輸是尺寸128的131,072 float32嵌入,從cupy/pytorch張量和pytorch變量,n = 100。 Google Colab的CPU有4個核心,這會影響轉移速度。具有更高數量的內核的CPU將看到使用Speedtorch的對流較少。
下表是結果的摘要。將數據從pytorch cuda張量轉移到cuda pytorch嵌入變量的速度要快於speedtorch等效物,但是對於所有其他傳輸類型,speedtorch的速度都快。對於從cuda pytorch嵌入/從cuda pytorch嵌入的兩個步驟的總和,對於常規GPU和CPU固定張量的張緊器,Speedtorch的速度比Pytorch等效的速度快。
我已經註意到,不同的colab實例會產生不同的速度結果,因此請記住這一點,同時審查這些結果。 COLAB筆記本電腦的個人運行可能會導致不同的值,儘管結果的Magnetude順序通常相同。
以下表中的轉移時間以秒為單位。這種基準測試是用CPU具有2個核心的COLAB實例進行的。 COLAB具有4個核心CPU的付費實例版本,因此以下基準測試不會反映這些實例。
| 張量類型 | 到Cuda Pytorch變量 | 比較 |
|---|---|---|
| Speedtorch(CUDA) | 0.0087 | 6.2倍慢於pytorch等效速度 |
| speedtorch(pinnedcpu) | 0.0154 | 3.1倍比Pytorch等效速度快 |
| pytorch(cuda) | 0.0014 | 6.2倍比Speedtorch等效速度快 |
| pytorch(pinnedcpu) | 0.0478 | 3.1倍慢於速度等效速度 |
| 張量類型 | 來自cuda pytorch變量 | 比較 |
|---|---|---|
| Speedtorch(CUDA) | 0.0035 | 9.7倍比Pytorch等效速度快 |
| speedtorch(pinnedcpu) | 0.0065 | 410倍比Pytorch等效速度快 |
| pytorch(cuda) | 0.0341 | 9.7倍慢於Speedtorch等效速度 |
| pytorch(pinnedcpu) | 2.6641 | 410x速度比Speedtorch等效速度慢 |
| 張量類型 | 從cuda pytorch變量的總和 | 比較 |
|---|---|---|
| Speedtorch(CUDA) | 0.0122 | 比pytorch等效的2.9倍 |
| speedtorch(pinnedcpu) | 0.0219 | 比pytorch等效速度快124倍 |
| pytorch(cuda) | 0.0355 | 比速度等效速度慢2.9倍 |
| pytorch(pinnedcpu) | 2.7119 | 比速度等效速度慢124倍 |
計算出類似的基準,用於從pytorch CUDA優化器轉移/轉移。結果基本相同,這是用於優化器基準測試的筆記本
https://colab.research.google.com/drive/1y2nehd8xj-ixfjkj2qwua_ujqjbbhhj5
儘管Speedtorch的張量通常比Pytorch的張量快,但缺點是Speedtorch的張量使用更多的內存。但是,由於傳輸數據可能會更快地發生,因此您可以使用Speedtorch通過在GPU和CPU中持有參數來增加體系結構中訓練的嵌入數量。
該表是Google Colab中進行基準測試的摘要。根據我的經驗,COLAB中報告的記憶值似乎有所不同, +-0.30 GB,因此請記住這一點,同時回顧這些數字。這些值用於保持10,000,000x128 Float32張量。
| 張量類型 | CPU(GB) | GPU(GB) |
|---|---|---|
| Cupy Pinnedcpu | 9.93 | 0.06 |
| Pytorch Pinnedcpu | 6.59 | 0.32 |
| Cupy Cuda | 0.39 | 9.61 |
| pytorch cuda | 1.82 | 5.09 |
儘管Pytorch的時間/從pytorch gpu張量<-> pytorch cuda變量不如杯狀等效速度快,但速度仍然是可行的。因此,如果記憶仍然是一個問題,則兩全其美的方法是Speedtorch的Cupy CPU固定張量以將參數存儲在CPU上,而Speedtorch的Pytorch GPU Tensors將參數存儲在GPU上。
這是我用於測量每種變量類型的內存數量的筆記本。 https://colab.research.google.com/drive/1zky7pyupaidrnx2hdtbujwo8juy0xkue如果在colab中使用此此功能,則需要在每個張量後重新啟動環境,以獲取下一個張力張者的措施。
對於CPU <-> GPU傳輸,這取決於要傳輸的數據量以及您擁有的核心數量。通常,對於1-2個CPU核心,Speedtorch的速度要快得多。但是,隨著CPU內核的數量增加,Pytorch的CPU <-> GPU索引操作變得更加有效。有關此的更多詳細信息,請參閱下一個“它如何工作”部分。有關一種簡單的方法,可以查看您是否在系統中獲得速度優勢,請在系統上運行基準代碼,但要更改數據量以反映您在應用程序中要使用的數量。
對於GPU <-> GPU傳輸,如果使用Vanilla Pytorch中的普通索引符號,則所有系統都會增加速度,因為Speedtorch繞過Pytorch的索引操作中的錯誤。但是,如果使用夜間版本,或者只是使用不同的索引概念,則可以避免此錯誤,請參閱“它如何工作”部分以獲取更多詳細信息。
更新9-20-19:我最初不知道為什麼要比使用Pytorch張量更快;我偶然地偶然發現了速度優勢。但是Pytorch論壇上的Pytorch開發人員之一指出了這一點。
至於更好的CPU <-> GPU傳輸,這是因為Speedtorch通過將CPU張量作為GPU張量來避免CPU索引操作。如果使用極少數CPU內核(例如Google Colab中的2),則CPU索引操作可能會很慢,但是如果您有很多核心,則可能會更快。這取決於您要傳輸多少數據以及您擁有多少核心。
至於更好的GPU <-> GPU傳輸,這是因為Speedtorch避免了索引操作中的錯誤。也可以通過使用夜間構建或使用index_select / index_copy_而不是1.1 / 1.2中的a[idx]符號來避免此錯誤。
有關此的更多詳細信息,請參閱此Pytorch帖子
https://discuss.pytorch.org/t/introducing-speedtorch-4x-speed-cpu-gpu-gpu-gpu-transfer-110x-gpu-cpu-cpu-transfer/56147/2
如果Pytorch工程師在某些情況下如何導致速度索引內核如何導致速度提高。不是傳輸本身越來越快,而是正在使用的索引內核。
至於CUPY中的內存管理如何工作,我直接提出了我問的這兩個堆疊式問題,而出色的用戶Robert Crovella不僅給出了詳細的解釋,而且還弄清楚瞭如何通過為Cupy開發自己的記憶分配者來將記憶固定在Cupy陣列中。這基本上是Speedtorch背後的核心技術。
https://stackoverflow.com/questions/57750125/cupy outmemoryerr-when-trying-to-cupy-load-load-larger-dimension-npy-npy-npy-npy-files in-me
https://stackoverflow.com/questions/57752516/how-to-to-use-cuda-pinned-zero-copy-memory-for-a-memory-memory-mapple-file
Speedtorch是可以安裝的。在導入Speedtorch之前,您需要安裝和導入CUPY。
!pip install SpeedTorch
import cupy
import SpeedTorch
該COLAB筆記本電腦顯示瞭如何使用其數據小工具將數據加載到Speedtorch中,以及如何將這些數據傳輸到Pytorch CUDA變量。
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttjqxeifhobxxf
請參閱速度基準筆記本,以查看使用Speedtorch的速度優勢。
對於首先試圖弄清楚如何使用Speedtorch的人們,我建議按照此示例遵循此示例,因為Word2Vec是機器學習中最常見的算法之一。
https://colab.research.google.com/drive/1apjr3onbgqwm3fbcbkmvwagxidxldxot
筆記本顯示瞭如何使用常規方式訓練Word2Vec,然後顯示瞭如何使用通常不支持稀疏訓練的優化器來使用Speedtorch對相同數據進行訓練。這是可能的,因為由於嵌入變量中包含的所有嵌入在每個步驟中都有一個更新,因此您可以在初始化期間設置sparse=False 。
tl; dr:
正常訓練:pytorch嵌入變量包含所有嵌入。 Pytorch優化器包含每個嵌入的所有相應參數權重。
Speedtorch Traing :Pytorch嵌入變量僅包含一批嵌入。 Pytorch優化器僅包含該批次的所有相應參數權重。 Sparsetorch張量包含其餘的,並在每個步驟將嵌入式/權重與Pytorch變量交換。
在稀疏的訓練算法(例如Word2Vec,手套或神經協作過濾)中,每一步都只對總參數(嵌入式)(嵌入式)進行了一小部分。如果您的GPU無法以所需的嵌入尺寸處理所有嵌入式,則可以選擇在固定的CPU CUPY陣列上託管一些參數,並根據需要將這些參數傳輸到模型張量。在Pytorch中進行此主要功能將非常慢,尤其是因為在cuda安裝的pytorch變量和固定的CPU Pytorch張量之間傳輸參數可能需要2.5-3秒(在Google Colab上)。幸運的是,此步驟僅需Speedtorch即可花費0.02-0.03秒!
案例用途:
--2,829,853本書嵌入 -
Speedtorch用於培訓2,829,853本書,用於一本稀有書籍。
https://github.com/santosh-gupta/lit2vec2
https://devpost.com/software/lit2vec2
每本書的嵌入尺寸為400,但嵌入496的嵌入方式可能已被使用,400個嵌入尺寸是由於我的Google驅動器上的空間限制來存儲訓練有素的嵌入式嵌入式:(。但是GPU RAM的限制不再是一個問題:)這是一個直接鏈接到與496嵌入式尺寸的直接鏈接
注意:您需要具有25 GB RAM的COLAB筆記本電腦的版本,而不是通常的12 GB。要獲取此類實例,您需要由於壓倒RAM而崩潰當前實例,然後在左下角的註釋詢問您是否要升級。您可以通過製作一個循環來使Numpy Float矩陣的大小增加一倍。
https://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19
這是與同一模型和數據的直接鏈接,但不使用Speedtorch
https://colab.research.google.com/drive/1idv1jbouzvpcfdsy40wirrphedoanti_
使用東正教訓練方法,Colab能夠處理的最大嵌入尺寸為255-260,任何高於該方法,都會發生CUDA誤差
RuntimeError: CUDA out of memory. Tried to allocate 2.74 GiB (GPU 0; 11.17 GiB total capacity; 8.22 GiB already allocated; 2.62 GiB free; 5.05 MiB cached)
-14,886,544研究論文嵌入 -
https://github.com/santosh-gupta/research2vec2
Speedtorch可以使我能夠以188的嵌入訓練14,886,544個研究論文嵌入,通過允許我將目標嵌入在CPU上,同時將我的目標嵌入在GPU上(使用SGD Optimizer(使用SGD Optimizer),因此使用了優化效果)。
這是筆記本的直接鏈接。
https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
注意:您需要具有25 GB RAM的COLAB筆記本電腦的版本,而不是通常的12 GB。要獲取此類實例,您需要由於壓倒RAM而崩潰當前實例,然後在左下角的註釋詢問您是否要升級。您可以通過製作一個循環來使Numpy Float矩陣的大小增加一倍。
沒有Speedtorch,在Google Colab Tesla K80 GPU上只能在RuntimeError: CUDA out of memory錯誤之前,只能在Google Colab Tesla K80 GPU上使用94-96的嵌入式。這是不使用Speedtorch的培訓的版本。
https://colab.research.google.com/drive/1jh7rugeajhdwdgnfwg3twm1zjytqu0kr
每當使用Cupy GPU張量時,請在任何固定的CPU張量之前初始化它們。這是因為Cupy GPU張量的初始化似乎使用了大量的CPU RAM。因此,如果您在CPU RAM上有限,並且已經在存儲器中固定了CPU張量,那麼初始化Cupy GPU張量的初始化可能會導致崩潰。
如果您能夠在GPU內存中適合所有參數,請使用純Pytorch,因為這是訓練的最快選擇。但是,如果您無法將所有參數安裝在內存中,請在Speedtorch的Cupy Cuda Tensors和Speedtorch的Cupy固定CPU張緊器之間分開參數(請記住您的優化器也具有權重);這是第二快的選項。但是,如果您仍然無法以這種方式將所有參數安裝到內存中,則將您的參數分配在Speedtorch的Cupy固定CPU張量和Speedtorch的Pytorch Cuda Tensors之間;這比這兩個選項都慢,但使用GPU內存較少。對於第三選項,以下是兩個筆記本,其中顯示了此https://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19, https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
訓練後,節省任何CUDA變量將導致內存使用量增加,並可能導致崩潰,尤其是隨著CUPY的速度。如果您處於RAM的範圍。在這種情況下,使用getNumpyVersion方法獲取張量的numpy版本,然後使用numpy.save或hdpy/pytables保存numpy陣列。 Numpy保存更輕巧。
打開問題,或在此處與我的目錄聊天https://gitter.im/speedtorch
我看上去圍繞快速CPU-> GPU轉移的更多功能不斷增加。如果您有想法,請發布GitHub問題。
此外,cupy GPU/固定的CPU和Pytorch GPU張量,Speedtorch還固定了Pytorch的CPU張量,以及CUPY MEMMAP GPU/固定的CPU張量。我尚未發現這些張量的可靠用途,但是它們已完全編碼且可用於使用。
https://github.com/santosh-gupta/speedtorch/tree/master/speedtorch
我想看的一個領域是,是否有一種方法可以使用Cupy Memmaps減少RAM內存。到目前為止,他們使用的記憶與實時版本一樣多。
ModelFactory ( model_variable , total_classes , embed_dimension , datatype = 'float32' , CPUPinn = False )使用CUPY為模型變量創建切換器。從完整的嵌入收集和模型批處理收集中開關變量。每個變量都需要自己的切換器。
例子:
uEmbed_switcher = SpeedTorch . ModelFactory ( skip_gram_modelSparse . u_embeddings , total_classes = 50000 , embed_dimension = 128 )參數:
model_variable :您想從模型中創建一個切換器的特定變量。
total_classes :要訓練的嵌入式總量。
embed_dimension :嵌入的尺寸。
datatype (可選):變量的數據類型。默認值為“ float32”。
CPUPinn (可選):將您的完整嵌入收集固定到CPU。備用GPU內存,但數據傳輸將較慢。默認值為false。
方法:
zerosInit() :用零以下來初始化變量切換器完整集合:
uniformDistributionInit(low, high) :初始化可變切換器完整收集,從low到high分佈
normalDistributionInit(mean, stdDev) :初始化具有mean的stdDev的變量切換器完整收集
variableTransformer( batchSize, posPerBatch, negPerBatch = None ) :設置一個虛擬輸入,用於模型的遠期步驟。 batchSize是批處理的大小,而posPerBatch是每個批次的積極示例的數量。如果負面示例需要第二個虛擬輸入,則可以將negPerBatch (可選)設置為負示例的數量,並且將返回兩個虛擬輸入而不是一個。
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) :開關從完整的嵌入式集合中嵌入到模型嵌入。 retrievedPosIndexes是要檢索的陽性樣品的索引。如果也要檢索負樣本,則可以通過檢索retrievedNegIndexes (可選)的值。
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) :開關從模型中更新的嵌入到完整的嵌入式集合中。 retrievedPosIndexes是檢索到的陽性樣品的索引。如果還檢索了負樣品,則可以通過retrievedNegIndexes (可選)值。
saveCupy(saveFileName) :將張量保存到.npy文件。
loadCupy(loadFileName) :來自.npy文件的加載張量。
getNumpyVersion :獲取張量的numpy版本。
OptimizerFactory( given_optimizer, total_classes, embed_dimension, model, variable_name, dtype='float32' , CPUPinn = False)
使用CUPY創建用於優化變量的切換器。從您的完整嵌入收集和優化器批處理收集中切換變量。每個變量都需要自己的切換器。
例子:
uAdagrad_switcher = SpeedTorch . OptimizerFactory ( given_optimizer , total_classes , embed_dimension , model , variable_name , dtype = 'float32' , CPUPinn = False )參數:
given_optimizer :優化器以您的模型權重初始化。如果用於嵌入訓練,請記住將sparse參數設置為False 。目前,支持的優化器是Sparseadam,Adadelta,Adamax,Adam,Adamw,Asgd和RMSProp。 RPROP也被嵌入,但是需要第一個遠程通行證,而loss.backward()步驟才能完成以初始化optimizerFactory實例。這是由於RPROP優化器需要其參數的梯度才能初始化。
total_classes :要訓練的嵌入式總量。
embed_dimension :嵌入的尺寸。
model :模型的實例。
variable_name :模型中定義的變量的確切名稱。
dtype (可選):變量的數據類型。默認為“ float32”
CPUPinn (可選):將完整的優化器可變重量收集固定到CPU。備用GPU內存,但數據傳輸將較慢。默認值為false。
方法:
optInit :初始化優化器變量切換器。
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) :開關優化器可變權重從完整的權重收集到優化器重量張量。 retrievedPosIndexes是要檢索的陽性樣品的索引。如果也要檢索負樣本,則可以通過檢索retrievedNegIndexes (可選)的值。
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) :開關從優化器轉換為全權重集合。 retrievedPosIndexes是檢索到的陽性樣品的索引。如果還檢索了負樣品,則可以通過retrievedNegIndexes (可選)值。
創建一個張量,其主要功能是將其內容傳輸到Pytorch CUDA變量。
DataGadget( fileName, CPUPinn=False)
參數:
fileName :數據的位置.npy文件要打開
CPUPinn :(可選):將數據固定到CPU。默認值為false。
方法:
getData(indexes) :以pytorch cuda變量接受的格式檢索數據。 indexes是從中從中從中檢索數據的索引。
insertData(dataObject, indexes) :從pytorch cuda變量插入數據。 dataObject是將從中從中檢索數據的Pytorch CUDA變量張量數據,並從中從中從中檢索數據的indexes 。
saveCupy(saveFileName) :將張量保存到.npy文件。
loadCupy(loadFileName) :來自.npy文件的新張量。
getNumpyVersion :獲取張量的numpy版本。
請查看有關如何使用數據小工具的筆記本
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttjqxeifhobxxf
PytorchModelFactory ( model_variable , total_classes , embed_dimension , datatype = 'float32' , deviceType = 'cuda' , pinType = False )使用Pytorch張量為模型變量創建切換器。從完整的嵌入收集和模型批處理收集中開關變量。每個變量都需要自己的切換器。
例子:
uEmbed_switcher = SpeedTorch . PytorchModelFactory ( skip_gram_modelSparse . u_embeddings , total_classes = 50000 , embed_dimension = 128 )參數:
model_variable :您想從模型中創建一個切換器的特定變量。
total_classes :要訓練的嵌入式總量。
embed_dimension :嵌入的尺寸。
datatype (可選):變量的數據類型。默認值為“ float32”。
deviceType (可選):將設備設置為“ CUDA”或“ CPU”。默認為“ cuda”
pinType (可選):如果設備設置為“ CPU”,則可以使用固定內存指定。默認值為“ false”。
方法:
zerosInit() :用零以下來初始化變量切換器完整集合:
uniformDistributionInit(low, high) :初始化可變切換器完整收集,從low到high分佈
normalDistributionInit(mean, stdDev) :初始化具有mean的stdDev的變量切換器完整收集
customInit(initFunction, *args) :使用任何Pytorch初始化器對變量切換器的完整收集。使用initFunction及其相應的參數使用*args傳遞初始化器。
variableTransformer(batchSize, posPerBatch, negPerBatch = None ) :設置一個虛擬輸入,用於模型的遠期步驟。 batchSize是批處理的大小,而posPerBatch是每個批次的積極示例的數量。如果負面示例需要第二個虛擬輸入,則可以將negPerBatch (可選)設置為負示例的數量,並且將返回兩個虛擬輸入而不是一個。
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) :開關從完整的嵌入式集合中嵌入到模型嵌入。 retrievedPosIndexes是要檢索的陽性樣品的索引。如果也要檢索負樣本,則可以通過檢索retrievedNegIndexes (可選)的值。
afterOptimizerStep(retrievedPosIndexes , retrievedNegIndexes = None) :開關從模型中更新的嵌入到完整的嵌入式集合中。 retrievedPosIndexes是檢索到的陽性樣品的索引。如果還檢索了負樣品,則可以通過retrievedNegIndexes (可選)值。
saveTorch(saveFileName) :使用Torch.Save保存張量
loadTorch(loadFileName) :使用Torch.Load的加載張量
getNumpyVersion :獲取張量的numpy版本。
PytorchOptimizerFactory( given_optimizer, total_classes, embed_dimension, model, variable_name, dtype='float32', deviceType = 'cuda', pinType = False)
使用Pytorch張量為優化變量創建切換器。從您的完整嵌入收集和優化器批處理收集中切換變量。每個變量都需要自己的切換器。
例子:
uAdagrad_switcher = SpeedTorch . PytorchOptimizerFactory ( given_optimizer , total_classes , embed_dimension , model , variable_name , dtype = 'float32' )參數:
given_optimizer :優化器以您的模型權重初始化。如果用於嵌入訓練,請記住將sparse參數設置為False 。目前,支持的優化器是Sparseadam,Adadelta,Adamax,Adam,Adamw,Asgd和RMSProp。 RPROP也被嵌入,但是需要第一個遠程通行證,而loss.backward()步驟才能完成以初始化optimizerFactory實例。這是由於RPROP優化器需要其參數的梯度才能初始化。
total_classes :要訓練的嵌入式總量。
embed_dimension :嵌入的尺寸。
model :模型的實例。
variable_name :模型中定義的變量的確切名稱。
dtype (可選):變量的數據類型。默認為“ float32”
deviceType (可選):將設備設置為“ CUDA”或“ CPU”。默認為“ cuda”
pinType (可選):如果設備設置為“ CPU”,則可以使用固定內存指定。默認值為“ false”。
方法:
optInit :初始化優化器變量切換器。
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) :開關優化器可變權重從完整的權重收集到優化器重量張量。 retrievedPosIndexes是要檢索的陽性樣品的索引。如果也要檢索負樣本,則可以通過檢索retrievedNegIndexes (可選)的值。
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) :開關從優化器轉換為全權重集合。 retrievedPosIndexes是檢索到的陽性樣品的索引。如果還檢索了負樣品,則可以通過retrievedNegIndexes (可選)值。
如果您在研究中使用Speedtorch或想引用,請引用:
@misc {
title = {speedtorch},
作者= {santosh gupta},
Howpublish = { url {github.com/santosh-gupta/speedtorch}},
年= {2019}
}