在某些情况下,更快的固定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}
}