特定の場合、より速くピン留めされたCPUテンソル<-> GPU Pytorch Variabe TransferとGPU Tensor <-> GPU Pytorch変数転送。
一部のシステムの場合、ピン留めされたPytorch CPUテンソルcpu使用すると、Cupyテンソルを使用するよりも速くなりますcuda PytorchOptimizerFactory機能するcpu 」セクションPytorchModelFactory参照してください。元のGPUPytorchModelFactoryおよびGPUPytorchOptimizerFactoryクラスはまだライブラリにあるため、SpeedTorchを使用する既存のコードは影響を受ける必要はありません。ドキュメントは、これらの新しいクラスを含めるように更新されました。
このライブラリは、CPUにピン留めされたCupyテンソルを中心に再び回転します。これにより、通常のPytorchピン留めCPUテンソル缶よりも3.1倍高速なCPU-> GPU転送を実現できます。速度は、データの量とシステム上のCPUコアの数に依存します(詳細については、それが機能する方法セクションを参照)
ライブラリには、埋め込みトレーニング用の機能が含まれています。 cpu RAMに埋め込みをホストし、アイドル状態でGPU RAMを節約します。
私は最初にこのライブラリを作成して、GPUがRAMを保持するのに苦労する可能性のある多数の埋め込みを訓練するのに役立ちました。これを行うために、CPUへの埋め込みの一部をホストすることで、これを達成するのに役立つことがわかりました。埋め込みシステムは、スプライズトレーニングを使用しています。総プラメターの一部のみがフォワード/アップデートステップに参加し、残りはアイドル状態です。それで、トレーニングステップ中にIDLEパラメーターを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開発者の1人が、元のベンチマーキングコードでいくつかの小さなバグを指摘しました。値とコードは更新されました)
これは、CPUとCUDAテンソルの両方を備えたSpeedTorch vs Pytorchテンソルを介した転送を比較するノートブックです。すべてのテストは、Tesla K80 GPUと2コアCPUを使用したColabインスタンスで行われました。
更新10-17-19:Google Colabは4つのコアCPUを備えた標準になりました。そのため、Pytorchのインデックス作成核はCPUコアの数が増えるにつれてより効率的になるため、このノートブックは以下と報告されているものとは異なる結果をもたらします。
https://colab.research.google.com/drive/1pxhbzqtiq_nlfguianpf_mfpiqskks
このノートブックは、n = 100で、Cupy/PytorchテンソルおよびPytorch変数との間で、dimension 128の131,072 float32埋め込みのデータ転送をタイムします。 Google ColabのCPUには4つのコアがあり、転送速度に影響を与えます。コアの数が多いCPUは、SpeedTorchを使用することへの進歩が少なくなります。
以下の表は、結果の概要です。 Pytorch CudaテンソルからCuda Pytorch Embedding変数にデータを転送することは、Speedtorch同等物よりも高速ですが、他のすべての転送タイプでは、SpeedTorchはより速いです。また、Cuda Pytorch Embeddingに出入りする両方のステップの合計のために、SpeedTorchは、通常のGPUとCPUの両方のテンソルの両方でPytorchに相当するよりも速いです。
Colabのさまざまなインスタンスが異なる速度結果をもたらすことに気付いたので、これらの結果を確認しながらこれを覚えておいてください。コラブノートブックの個人的な実行は異なる値になる場合がありますが、結果の磁気の順序は一般的に同じです。
次の表の転送時間は数秒で与えられます。このベンチマークは、CPUに2つのコアがあるColabインスタンスで事前に形成されました。 Colabには、4コアCPUの有料インスタンスのPROバージョンがあるため、次のベンチマークはそれらのインスタンスに反映されません。
| テンソルタイプ | Cuda Pytorch変数へ | 比較 |
|---|---|---|
| SpeedTorch(cuda) | 0.0087 | Pytorchに相当するよりも6.2倍遅い |
| speedtorch(pinnedcpu) | 0.0154 | Pytorchに相当するよりも3.1x速い |
| pytorch(cuda) | 0.0014 | SpeedTorchに相当するよりも6.2倍高速 |
| pytorch(pinnedcpu) | 0.0478 | SpeedTorchに相当する3.1x遅い |
| テンソルタイプ | Cuda Pytorch変数から | 比較 |
|---|---|---|
| SpeedTorch(cuda) | 0.0035 | Pytorchに相当するよりも速い9.7x |
| speedtorch(pinnedcpu) | 0.0065 | Pytorchに相当するよりも速い410x |
| pytorch(cuda) | 0.0341 | SpeedTorchに相当するよりも9.7倍遅い |
| pytorch(pinnedcpu) | 2.6641 | SpeedTorchに相当する410x遅い |
| テンソルタイプ | Cuda Pytorch変数の合計 | 比較 |
|---|---|---|
| SpeedTorch(cuda) | 0.0122 | Pytorchに相当するよりも2.9x速い |
| speedtorch(pinnedcpu) | 0.0219 | Pytorchに相当するよりも速い124倍 |
| pytorch(cuda) | 0.0355 | SpeedTorchに相当するよりも2.9倍遅い |
| pytorch(pinnedcpu) | 2.7119 | SpeedTorchに相当するよりも124倍遅い |
同様のベンチマークは、Pytorch Cudaオプティマイザーとの間での転送のために計算されました。結果は基本的に同じです。ここにオプティマイザーのベンチマークに使用されるノートブックがあります
https://colab.research.google.com/drive/1y2nehd8xj-ixfjkj2qwua_ujqjbhhj5
SpeedTorchのテンソルは一般にPytorchのテンソルよりも高速ですが、欠点はSpeedTorchのテンソルがより多くのメモリを使用することです。ただし、データの転送はより迅速に発生する可能性があるため、SpeedTorchを使用して、GPUとCPUの両方にパラメーターを保持することにより、アーキテクチャでトレーニングされた埋め込みの数を増やすことができます。
このテーブルは、Google Colabで行われたベンチマークの要約です。私の経験から、colabの報告されたメモリ値 +-0.30 gbにある程度の変動があるように思われるため、これらの数字を確認しながらこれに留意してください。値は、10,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 GPU Tensor <-> Pytorch Cuda変数のPytorchの時間は、Cupyに相当するほど速くはありませんが、速度はまだ実行可能です。したがって、記憶がまだ懸念されている場合、両方の世界の最善のアプローチは、SpeedtorchのCUPY CPUをCPUにパラメーターを保存するためにテンソルをピン留めし、SpeedTorchのPytorch GPUテンソルを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開発者の1人がそれを指摘しました。
より良いCPU <-> GPU転送に関しては、SpeedTorchがCPUテンソルをGPUテンソルとしてマスカーしてCPUインデックス操作を回避するためです。 Google Colabの2などのCPUコアが非常に少ない場合は、CPUインデックスの操作が遅くなる可能性がありますが、多くのコアがある場合はより速くなる可能性があります。それは、あなたが転送しているデータの量とあなたが持っているコアの数に依存します。
より良いGPU <-> GPU転送については、SpeedTorchがインデックス操作のバグを回避するためです。このバグは、1.1 / 1.2のa[idx]表記の代わりに、夜間ビルドを使用するか、 index_select / index_copy_使用することで回避することもできます。
この詳細については、このPytorch Postをご覧ください
https://discuss.pytorch.org/t/introducing-speedtorch-4x-speed-cpu-gpu-transfer-10x-gpu-cpu-transfer/56147/2
Pytorchエンジニアが、特定の場合にCupy Indecuning Kernalsがどのようにスピードアップをもたらすかについての詳細な分析を提供する場合。より速くなっているのは転送自体ではなく、使用されているインデックスの縁です。
Cupyのメモリ管理がどのように機能するかについては、私が尋ねたこれらの2つのStackoverflowの質問に向けて、素晴らしいユーザーのRobert Crovellaが詳細な説明をしただけでなく、Cupyのために独自のメモリアロケーターを開発することにより、ピン留めメモリをCupyアレイに割り当てる方法を見つけました。これは基本的に、Speedtorchの背後にあるコアテクノロジーです。
https://stackoverflow.com/questions/57750125/cupy-outofmemoryerror-when-trying to-cupy-lager-dimension-npy-files-in-me
https://stackoverflow.com/questions/57752516/how-to-use-cuda-pinned-zero-copy-memory-for-a-memory-mapped-file
SpeedTorchはPIPインストール可能です。 SpeedTorchをインポートする前に、CUPYをインストールおよびインポートする必要があります。
!pip install SpeedTorch
import cupy
import SpeedTorch
このColabノートブックは、データガジェットを使用してSpeedTorchにデータをロードする方法と、このデータをPytorch Cuda変数に送信する方法を示しています。
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttjqxeifhobxxf
SpeedTorchを使用することの速度の利点を確認するには、Speed Benchmarking Notebookをご覧ください。
Word2Vecは機械学習で最も一般的に知られているアルゴリズムの1つであるため、最初にSpeedTorchの使用方法を見つけようとする人には、この例に従うことをお勧めします。
https://colab.research.google.com/drive/1apjr3onbgqwm3fbcbkmvwagxidxldxot
ノートブックは、通常の方法でWord2vecをトレーニングする方法を示しており、通常、スパーストレーニングにサポートされていないオプティマイザーの1つを使用して、SpeedTorchを使用して同じデータでトレーニングする方法を示します。これは、埋め込み変数に含まれるすべての埋め込みが各ステップ中に更新があるため、初期化中にsparse=Falseを設定できるためです。
tl; dr:
通常のトレーニング:Pytorch埋め込み変数には、すべての埋め込みが含まれています。 Pytorch Optimizerには、各埋め込みに対応するすべてのパラメーター重みが含まれています。
SpeedTorch Traing :Pytorch EmbedDng変数には、埋め込みのバッチのみが含まれています。 Pytorch Optimizerには、そのバッチの対応するすべてのパラメーター重みのみが含まれています。 Sparsetorchテンソルには残りが含まれており、各ステップでPytorch変数と埋め込み/重みを交換します。
Word2Vec、グローブ、ニューラルの共同フィルタリングなどのまばらなトレーニングアルゴリズムでは、すべてのステップでトレーニングされている合計パラメーター(埋め込み)のほんの一部のみがトレーニングされます。 GPUがすべての埋め込みを目的の埋め込みサイズで処理できない場合、オプションは、ピン留めされたCPU Cupyアレイでパラメーターの一部をホストし、必要に応じてそれらのパラメーターをモデルテンソルに転送することです。 Pytorchでこのプライマリを実行するのは非常に遅いです。特に、CUDAマウントされたPytorch変数とピン留めされたCPU Pytorchテンソルの間にパラメーターを転送することは2.5〜3秒かかる可能性があるためです。幸いなことに、このステップは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ドライブのスペースの制限によるものでした。
注:通常の12 GBではなく、25 GBのRAMを備えたコラブノートブックのバージョンが必要です。このタイプのインスタンスを取得するには、RAMを圧倒するために現在のインスタンスをクラッシュさせる必要があります。次に、左下隅のメモがアップグレードするかどうかを尋ねる必要があります。これを行うには、Numpy Floatマトリックスのサイズを2倍にし続けるループを作成することで行うことができます。
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オプティマイザーを使用したため、オプティマイザーの重量はありません)。
これがノートブックへの直接リンクです。
https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
注:通常の12 GBではなく、25 GBのRAMを備えたコラブノートブックのバージョンが必要です。このタイプのインスタンスを取得するには、RAMを圧倒するために現在のインスタンスをクラッシュさせる必要があります。次に、左下隅のメモがアップグレードするかどうかを尋ねる必要があります。これを行うには、Numpy Floatマトリックスのサイズを2倍にし続けるループを作成することで行うことができます。
SpeedTorchがなければ、 RuntimeError: CUDA out of memoryエラーの前に、Google Colab Tesla K80 GPUで94-96の埋め込みサイズのみを使用できます。これは、SpeedTorchを使用せずにトレーニングのバージョンです。
https://colab.research.google.com/drive/1jh7rugeajhdwdwdgnfwg3twm1zjytqu0kr
Cupy GPUテンソルを使用するときはいつでも、ピン留めされたCPUテンソルの前にこれらを初期化します。これは、Cupy GPUテンソルの初期化がしっかりした量のCPU RAMを使用しているように見えるためです。したがって、CPU RAMで制限されていて、すでにピン留めCPUテンソルをメモリに持っている場合、CUPY GPUテンソルを初期化するとクラッシュが発生する可能性があります。
GPUメモリにすべてのパラメーターを適合させることができる場合は、これがトレーニングの最速オプションであるため、Pure Pytorchを使用してください。ただし、すべてのパラメーターをメモリに適合できない場合は、SpeedTorchのCudy CudaテンソルとSpeedTorchのCupy Pinced CPUテンソルの間にパラメーターを分割してください(オプティマイザーにも重みがあることに注意してください)。これは2番目に速いオプションです。ただし、すべてのパラメーターをその方法でメモリに適合させることができない場合は、SpeedTorchのCupyピン留めCPUテンソルとSpeedTorchのPytorch Cudaテンソルの間にパラメーターを分割します。これは両方のオプションよりも遅いですが、GPUメモリが少なくなります。 3番目のオプションについては、このhttps://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19の例を示す2つのノートブックを紹介します。 https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
トレーニング後、CUDA変数を保存すると、メモリ使用量が増加し、特にCupyでクラッシュを引き起こす可能性があります。あなたがあなたのラムの限界にあるなら。この場合、 getNumpyVersionメソッドを使用してテンソルのnumpyバージョンを取得し、numpy.saveまたはhdpy/pytablesを使用してnumpy配列を保存します。 Numpy Saveはより軽量です。
問題を開くか、ここでギッターでディレクトリとチャットするかhttps://gitter.im/speedtorch
高速CPU-> GPU転送の周りにより多くの機能を取り入れています。アイデアがある場合は、githubの問題を投稿してください。
さらに、Cupy GPU/ピン留めされたCPUおよびPytorch GPUテンソルに加えて、SpeedTorchにはPytorchがCPUテンソルを固定し、Cupy Memmap GPU/Pind CPUテンソルもあります。私はこの種のテンソルにしっかりと使用していませんが、それらは完全にコード化されており、使用するために利用できます。
https://github.com/santosh-gupta/speedtorch/tree/master/speedtorch
私が見たい領域の1つは、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にピン留めします。 SPARES GPUメモリですが、データ転送は遅くなります。デフォルトはfalseです。
方法:
zerosInit() :Zerosを使用して変数Switcherフルコレクションを初期化します。
uniformDistributionInit(low, high) : lowからhighに均一な分布で可変スイッチャーフルコレクションを初期化します
normalDistributionInit(mean, stdDev) stdDev meanの平均と標準偏差を持つ正規分布で可変スイッチャーフルコレクションを初期化します
variableTransformer( batchSize, posPerBatch, negPerBatch = None ) :モデルのフォワードステップに使用するダミー入力を設定します。 batchSizeはバッチのサイズであり、 posPerBatchバッチあたりのポジティブな例の数です。否定的な例に2番目のダミー入力が必要な場合、 negPerBatch (オプション)を否定的な例の数に設定でき、2つのダミー入力を1つではなく返します。
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()ステップが必要です。これは、RPROPオプティマイザーが初期化のためにそのパラメーターの勾配を必要とするためです。
total_classes :トレーニングする埋め込みの合計量。
embed_dimension :埋め込みの寸法。
model :モデルのインスタンス。
variable_name :モデルで定義されている変数の正確な名前。
dtype (オプション):変数のデータ型。デフォルトは「float32」です
CPUPinn (オプション):完全なオプティマイザー変数の重量コレクションをCPUにピン留めします。 SPARES 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() :Zerosを使用して変数Switcherフルコレクションを初期化します。
uniformDistributionInit(low, high) : lowからhighに均一な分布で可変スイッチャーフルコレクションを初期化します
normalDistributionInit(mean, stdDev) stdDev meanの平均と標準偏差を持つ正規分布で可変スイッチャーフルコレクションを初期化します
customInit(initFunction, *args) :変数スイッチャーフルコレクションにPytorch Initializerを使用します。 initFunctionとその対応する引数を使用して*argsを使用して初期化を渡します。
variableTransformer(batchSize, posPerBatch, negPerBatch = None ) :モデルのフォワードステップに使用するダミー入力を設定します。 batchSizeはバッチのサイズであり、 posPerBatchバッチあたりのポジティブな例の数です。否定的な例に2番目のダミー入力が必要な場合、 negPerBatch (オプション)を否定的な例の数に設定でき、2つのダミー入力を1つではなく返します。
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()ステップが必要です。これは、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}、
howpublished = { url {github.com/santosh-gupta/speedtorch}}、
年= {2019}
}