Tensor CPU yang disematkan lebih cepat <-> transfer varibe pytorch dan tensor GPU <-> transfer variabel pytorch GPU, dalam kasus tertentu.
Karena untuk beberapa sistem, menggunakan tensor CPU Pytorch yang disematkan lebih cepat daripada menggunakan tensor cupy (lihat bagian 'Bagaimana cara kerjanya' untuk lebih detail), saya menciptakan kelas tenorch umum PytorchModelFactory dan PytorchOptimizerFactory yang dapat digunakan untuk mengatur cuda cpu cpu , dan memori. GPUPytorchModelFactory asli dan kelas GPUPytorchOptimizerFactory masih ada di perpustakaan, jadi tidak ada kode yang ada menggunakan SpeedTorch yang harus terpengaruh. Dokumentasi telah diperbarui untuk memasukkan kelas -kelas baru ini.
Perpustakaan ini berprestasi di sekitar tensor cupy yang disematkan ke CPU, yang dapat mencapai 3,1x lebih cepat CPU -> transfer GPU daripada kaleng CPU Pytorch yang disematkan, dan 410x GPU lebih cepat -> transfer CPU. Kecepatan tergantung pada jumlah data, dan jumlah inti CPU pada sistem Anda (lihat bagian cara kerjanya untuk lebih jelasnya)
Perpustakaan mencakup fungsi untuk pelatihan embeddings; Ini dapat menjadi tuan rumah embeddings pada RAM CPU saat mereka menganggur, hemat GPU RAM.
Awalnya saya membuat perpustakaan ini untuk membantu melatih sejumlah besar embeddings, yang GPU mungkin kesulitan memegang RAM. Untuk melakukan ini, saya menemukan bahwa dengan menampung beberapa embeddings pada CPU dapat membantu mencapai ini. Sistem penyematan menggunakan pelatihan sprase; Hanya sebagian kecil dari total prameter yang berpartisipasi dalam langkah -langkah maju/pembaruan, sisanya menganggur. Jadi saya pikir, mengapa tidak menjaga parameter idle dari GPU selama langkah pelatihan? Untuk ini, saya membutuhkan CPU cepat -> transfer GPU.
Untuk latar belakang lengkap, silakan lihat halaman DevPost
https://devpost.com/software/speedtorch-6w5unb
Dengan CPU-> GPU yang cepat, banyak metode menyenangkan dapat dikembangkan untuk fungsionalitas yang sebelumnya menurut orang mungkin tidak mungkin.
? ️ Masukkan SpeedTorch ke dalam jaringan pipa data Anda untuk transfer data cepat ke/dari CPU <-> GPU
? ️ Parameter pelatihan augment melalui penyimpanan CPU. Selama Anda memiliki cukup RAM CPU, Anda dapat meng -host sejumlah embeddings tanpa harus khawatir tentang RAM GPU.
? ️ Gunakan Adadelta, Adamax, RMSPROP, RPROP, ASGD, ADAMW, dan Adam Optimizers untuk Pelatihan Embeddings yang jarang. Sebelumnya, hanya Spraseadam, Adagrad, dan SGD yang cocok karena hanya ini secara langsung mendukung gradien jarang.
(Edit 9-20-19, salah satu pengembang Pytorch menunjukkan beberapa bug kecil dalam kode penandaan bangku asli, nilai dan kode telah diperbarui)
Berikut adalah notebook yang membandingkan transfer melalui Tensor SpeedTorch vs Pytorch, dengan kedua tensor CPU dan CUDA yang disematkan. Semua tes dilakukan dengan instance colab dengan GPU Tesla K80, dan 2 CPU inti.
UPDATE 10-17-19: Google Colab sekarang standar dengan 4 CPU inti, jadi buku catatan ini akan memberikan hasil yang berbeda dari yang dilaporkan di bawah ini, karena kernal pengindeksan Pytorch menjadi lebih efisien karena jumlah core CPU meningkat.
https://colab.research.google.com/drive/1pxhbmbzqtiq_nlfguianpf_mfpiqskks
Buku catatan ini kali transfer data 131.072 embeddings float32 dimensi 128, ke dan dari tensor cupy/pytorch dan variabel pytorch, dengan n = 100. CPU Google Colab memiliki 4 core, yang berdampak pada kecepatan transfer. CPU dengan jumlah core yang lebih tinggi akan melihat lebih sedikit keahlian untuk menggunakan SpeedTorch.
Tabel di bawah ini adalah ringkasan hasil. Mentransfer data dari tensor Pytorch Cuda ke variabel embedding CUDA Pytorch lebih cepat daripada yang setara dengan speedtorch, tetapi untuk semua jenis transfer lainnya, Speedtorch lebih cepat. Dan untuk jumlah kedua langkah yang ditransfer ke/dari embedding Cuda Pytorch, SpeedTorch lebih cepat daripada yang setara dengan Pytorch untuk tensor GPU dan CPU yang teratur.
Saya telah memperhatikan bahwa berbagai contoh Colab menghasilkan hasil kecepatan yang berbeda, jadi ingatlah ini saat meninjau hasil ini. Jalankan notebook Colab pribadi dapat menghasilkan nilai yang berbeda, meskipun urutan magnetude hasil umumnya sama.
Waktu transfer dalam tabel berikut diberikan dalam hitungan detik. Benchmarking ini dibentuk sebelumnya dengan instance Colab yang CPUnya memiliki 2 core. Colab memiliki versi pro dari instance berbayar yang merupakan 4 CPU inti, sehingga pembandingan berikut tidak akan mencerminkan untuk contoh -contoh tersebut.
| Jenis tensor | Variabel cuda pytorch | Perbandingan |
|---|---|---|
| SpeedTorch (CUDA) | 0,0087 | 6.2x lebih lambat dari yang setara dengan Pytorch |
| SpeedTorch (PinnedCPU) | 0,0154 | 3.1x lebih cepat dari yang setara dengan Pytorch |
| Pytorch (CUDA) | 0,0014 | 6.2x lebih cepat dari yang setara SpeedTorch |
| Pytorch (pinnedcpu) | 0,0478 | 3.1x lebih lambat dari yang setara dengan speedTorch |
| Jenis tensor | Dari variabel cuda pytorch | Perbandingan |
|---|---|---|
| SpeedTorch (CUDA) | 0,0035 | 9.7x lebih cepat dari yang setara dengan Pytorch |
| SpeedTorch (PinnedCPU) | 0,0065 | 410x lebih cepat dari yang setara dengan Pytorch |
| Pytorch (CUDA) | 0,0341 | 9.7x lebih lambat dari yang setara dengan speedtorch |
| Pytorch (pinnedcpu) | 2.6641 | 410x lebih lambat dari yang setara dengan speedtorch |
| Jenis tensor | Jumlah ke/dari variabel cuda pytorch | Perbandingan |
|---|---|---|
| SpeedTorch (CUDA) | 0,0122 | 2.9x lebih cepat dari yang setara dengan Pytorch |
| SpeedTorch (PinnedCPU) | 0,0219 | 124x lebih cepat dari yang setara dengan Pytorch |
| Pytorch (CUDA) | 0,0355 | 2.9x lebih lambat dari yang setara dengan speedtorch |
| Pytorch (pinnedcpu) | 2.7119 | 124x lebih lambat dari yang setara dengan speedtorch |
Tolok ukur serupa dihitung untuk ditransfer ke/dari pengoptimal Pytorch Cuda. Hasilnya pada dasarnya sama, berikut adalah buku catatan yang digunakan untuk pembandingan pengoptimal
https://colab.research.google.com/drive/1y2nehd8xj-ixfjkj2qwua_ujqjbbhhj5
Meskipun Tensor SpeedTorch umumnya lebih cepat dari Pytorch, kelemahannya adalah Tensor SpeedTorch menggunakan lebih banyak memori. Namun, karena mentransfer data dapat terjadi lebih cepat, Anda dapat menggunakan SpeedTorch untuk menambah jumlah embeddings yang dilatih dalam arsitektur Anda dengan memegang parameter di GPU dan CPU.
Tabel ini adalah ringkasan pembandingan yang dilakukan di Google Colab. Dari pengalaman saya, tampaknya ada beberapa variasi dalam nilai memori yang dilaporkan di Colab, +-0,30 GB, jadi ingatlah ini saat meninjau angka-angka ini. Nilai -nilainya untuk memegang 10.000.000x128 float32 tensor.
| Jenis tensor | 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 |
Meskipun waktu Pytorch untuk/dari untuk Tensor GPU Pytorch <-> variabel Pytorch Cuda tidak secepat yang setara dengan secoivalen, kecepatannya masih bisa diterapkan. Jadi, jika ingatan masih menjadi perhatian, pendekatan terbaik dari kedua dunia adalah dengan CPU Cupy CPU SpeedTorch menyematkan tensor untuk menyimpan parameter pada CPU, dan Tensor GPU Pytorch SpeedTorch untuk menyimpan parameter pada GPU.
Ini adalah buku catatan yang saya gunakan untuk mengukur berapa banyak memori yang dibutuhkan setiap jenis variabel. https://colab.research.google.com/drive/1zky7pyupaidrnx2hdtbujwo8juy0xkue Jika menggunakan ini di Colab, Anda perlu memulai kembali lingkungan setelah setiap pembuatan tensor, untuk mendapatkan ukuran untuk tensor berikutnya.
Untuk transfer CPU <-> GPU, itu tergantung pada jumlah data yang ditransfer, dan jumlah inti yang Anda miliki. Umumnya untuk 1-2 CPU Core SpeedTorch akan jauh lebih cepat. Tetapi ketika jumlah inti CPU naik, operasi pengindeksan CPU Pytorch <-> GPU menjadi lebih efisien. Untuk detail lebih lanjut tentang ini, silakan lihat bagian 'How It Works' berikutnya. Untuk cara yang mudah untuk melihat apakah Anda mendapatkan keuntungan kecepatan dalam sistem Anda, silakan jalankan kode tolok ukur pada sistem Anda, tetapi ubah jumlah data untuk mencerminkan jumlah yang akan Anda kerjakan dalam aplikasi Anda.
Untuk transfer GPU <-> GPU, jika menggunakan notasi pengindeksan biasa di vanilla pytorch, semua sistem akan mendapatkan peningkatan kecepatan karena SpeedTorch mem-bypass bug dalam operasi pengindeksan Pytorch. Tetapi bug ini dapat dihindari jika menggunakan versi malam hari, atau hanya menggunakan gagasan pengindeksan yang berbeda, silakan lihat bagian 'Bagaimana cara kerjanya' untuk detail lebih lanjut.
UPDATE 9-20-19: Saya awalnya tidak tahu mengapa ini lebih cepat daripada menggunakan tensor Pytorch; Saya menemukan keuntungan kecepatan secara tidak sengaja. Tapi salah satu pengembang Pytorch di Forum Pytorch menunjukkannya.
Sedangkan untuk transfer CPU yang lebih baik <-> GPU, itu karena SpeedTorch menghindari operasi pengindeksan CPU dengan menutupi tensor CPU sebagai tensor GPU. Operasi indeks CPU mungkin lambat jika bekerja dengan sangat sedikit core CPU, seperti 2 di Google Colab, tetapi mungkin lebih cepat jika Anda memiliki banyak core. Itu tergantung pada berapa banyak data yang Anda transfer dan berapa banyak inti yang Anda miliki.
Adapun transfer GPU yang lebih baik <->, itu karena SpeedTorch menghindari bug dalam operasi pengindeksan. Bug ini juga dapat dihindari dengan menggunakan build malam, atau menggunakan index_select / index_copy_ alih -alih notasi a[idx] dalam 1.1 / 1.2.
Untuk detail lebih lanjut tentang ini, silakan lihat posting Pytorch ini
https://discuss.pytorch.org/t/introducing-speedtorch-4x-speed-cpu-gpu-transfer-110x-gpu-cpu-transfer/56147/2
Di mana seorang insinyur Pytorch memberikan analisis terperinci tentang bagaimana kernal pengindeksan cupy menghasilkan kecepatan dalam kasus -kasus tertentu. Bukan transfer itu sendiri yang semakin cepat, tetapi pengindeksan kernal yang sedang digunakan.
Adapun bagaimana manajemen memori di Cupy bekerja, saya mengarahkan dua pertanyaan StackOverflow yang saya tanyakan ini, di mana pengguna yang brilian Robert Crovella tidak hanya memberikan penjelasan terperinci, tetapi juga menemukan cara mengalokasikan memori yang disematkan ke array cupy dengan mengembangkan ingatannya sendiri untuk Cupy. Ini pada dasarnya adalah teknologi inti di balik SpeedTorch.
https://stackoverflow.com/questions/57750125/cupy-outofmemoryerror-when-kying-to-cupy-load-larger-dimension-npy-files-in--u
https://stackoverflow.com/questions/57752516/how-to-use-suse-cuda-pinned-zero-copy-memory-for-a-memory-mapped-file
SpeedTorch dapat diinstal Pip. Anda harus memasang cupy dan diimpor sebelum Anda mengimpor SpeedTorch.
!pip install SpeedTorch
import cupy
import SpeedTorch
Colab Notebook ini menunjukkan cara memuat data ke SpeedTorch menggunakan gadget data, dan cara mentransfer data ini ke/dari variabel Pytorch CUDA.
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttjqxeifhobxxf
Silakan lihat buku catatan pembandingan kecepatan untuk melihat keunggulan kecepatan menggunakan SpeedTorch.
Untuk orang -orang pertama kali mencoba mencari cara menggunakan SpeedTorch, saya sarankan mengikuti contoh ini, karena Word2Vec adalah salah satu algoritma yang lebih dikenal dalam pembelajaran mesin.
https://colab.research.google.com/drive/1apjr3onbgqwm3fbcbkmvwagxidxldxot
Notebook menunjukkan cara melatih Word2Vec dengan cara reguler, kemudian menunjukkan cara menggunakan SpeedTorch untuk berlatih pada data yang sama, menggunakan salah satu pengoptimal yang biasanya tidak didukung untuk pelatihan yang jarang. Ini dimungkinkan karena karena semua embedding yang terkandung dalam variabel embedding memiliki pembaruan selama setiap langkah, Anda dapat menetapkan sparse=False selama inisialisasi.
TL; DR:
Pelatihan Normal : Variabel embedding pytorch berisi semua embeddings. Pytorch Optimizer berisi semua bobot parameter yang sesuai untuk setiap embedding.
SPEEDTORCH TRAING : Pytorch embeddng variabel hanya mengandung batch embeddings. Pytorch Optimizer hanya berisi semua bobot parameter yang sesuai untuk batch itu. Tensor Sparsetorch mengandung sisanya, dan menukar embeddings/bobot dengan variabel pytorch pada setiap langkah.
Dalam algoritma pelatihan yang jarang seperti Word2Vec, Glove, atau penyaringan kolaboratif saraf, hanya sebagian kecil dari total parameter (embeddngs) yang dilatih selama setiap langkah. Jika GPU Anda tidak dapat menangani semua embedding Anda pada ukuran embedding yang diinginkan, opsi adalah meng -host beberapa parameter Anda pada array cupy CPU yang disematkan, dan mentransfer parameter tersebut ke tensor model Anda sesuai kebutuhan. Melakukan primer ini di Pytorch akan sangat lambat, terutama karena mentransfer parameter antara variabel Pytorch yang dipasang CUDA dan tensor CPU Pytorch yang disematkan dapat memakan waktu 2,5-3 detik (di Google Colab). Untungnya, langkah ini hanya membutuhkan 0,02-0,03 detik dengan SpeedTorch!
Penggunaan kasus:
--2.829.853 Buku Embeddings--
SpeedTorch digunakan dalam pelatihan 2.829.853 buku untuk rekomendasi buku langka.
https://github.com/santosh-gupta/lit2vec2
https://devpost.com/software/lit2vec2
Setiap buku memiliki ukuran embedding 400, tetapi ukuran embedding 496 bisa digunakan, ukuran 400 embedding disebabkan oleh batas ruang di Google Drive saya untuk menyimpan embeddings yang terlatih :(. Tetapi batasan RAM GPU tidak lagi menjadi masalah:: Di sini adalah tautan langsung ke notebook pelatihan demo, yang melatih GPU 496 adalah sebuah emban:
Catatan: Anda memerlukan versi Colab Notebook yang memiliki 25 GB RAM, bukan 12 GB biasa. Untuk mendapatkan jenis instance ini, Anda perlu menghancurkan instance Anda saat ini karena membanjiri RAM, dan kemudian catatan di sudut kiri bawah menanyakan apakah Anda ingin meningkatkan. Anda dapat melakukan ini dengan membuat lingkaran yang terus menggandakan ukuran matriks float numpy.
https://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19
Berikut adalah tautan langsung dengan model dan data yang sama, tetapi tidak menggunakan speedTorch
https://colab.research.google.com/drive/1idv1jbouzvpcfdsy40wirrphedoanti_
Menggunakan metode pelatihan ortodoks, ukuran embedding terbesar yang dapat ditangani Colab adalah 255-260, lebih tinggi dari itu dan kesalahan CUDA akan terjadi
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)
--4.886.544 Makalah Penelitian Embeddings--
https://github.com/santosh-gupta/research2vec2
SpeedTorch dapat memungkinkan saya untuk melatih 14.886.544 makalah penelitian dengan ukuran embedding 188, dengan memungkinkan saya untuk menyimpan target embeddings pada CPU, sambil menjaga konteks saya embedding pada GPU (pengoptimal SGD digunakan, jadi tidak ada bobot pengoptimal pengoptimal).
Berikut ini tautan langsung ke buku catatan.
https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
Catatan: Anda memerlukan versi Colab Notebook yang memiliki 25 GB RAM, bukan 12 GB biasa. Untuk mendapatkan jenis instance ini, Anda perlu menghancurkan instance Anda saat ini karena membanjiri RAM, dan kemudian catatan di sudut kiri bawah menanyakan apakah Anda ingin meningkatkan. Anda dapat melakukan ini dengan membuat lingkaran yang terus menggandakan ukuran matriks float numpy.
Tanpa SpeedTorch, hanya ukuran embedding 94-96 yang dapat digunakan di Google Colab Tesla K80 GPU sebelum RuntimeError: CUDA out of memory . Berikut adalah versi pelatihan tanpa menggunakan SpeedTorch.
https://colab.research.google.com/drive/1jh7rugeajhdwdgnfwg3twm1zjytqu0kr
Setiap kali menggunakan tensor GPU cupy, inisialisasi ini sebelum tensor CPU yang disematkan. Ini karena inisialisasi tensor GPU cupy tampaknya menggunakan jumlah CPU RAM yang solid. Jadi, jika Anda terbatas pada RAM CPU, dan Anda sudah memiliki tensor CPU yang disematkan dalam memori, maka menginisialisasi tensor GPU cupy dapat menyebabkan kecelakaan.
Jika Anda dapat memasukkan semua parameter Anda dalam memori GPU Anda, gunakan Pure Pytorch karena ini adalah pilihan tercepat untuk pelatihan. Tetapi jika Anda tidak dapat memasukkan semua parameter Anda dalam memori, belah parameter Anda (perlu diingat bahwa pengoptimal Anda juga memiliki bobot) antara tensor CUDA Cupy SpeedTorch dan tensor CPU yang disematkan oleh SpeedTorch; Ini adalah opsi tercepat ke -2. Tetapi, jika Anda masih belum dapat memasukkan semua parameter Anda ke dalam memori dengan cara itu, maka pisahkan parameter Anda antara tensor CPU Cupy SpeedTorch yang disematkan, dan tensor Cuda Pytorch SpeedTorch; Ini lebih lambat dari kedua opsi, tetapi menggunakan lebih sedikit memori GPU. Untuk opsi ke-3, berikut adalah dua buku catatan yang menunjukkan contoh https://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19, https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
Setelah pelatihan, menyimpan variabel CUDA apa pun akan menyebabkan peningkatan penggunaan memori, dan dapat menyebabkan kecelakaan, terutama dengan cupy. Jika Anda berada di batas RAM Anda. Dalam hal ini, gunakan metode getNumpyVersion untuk mendapatkan versi numpy dari tensor Anda, dan kemudian gunakan menggunakan numpy.save atau hdpy/pytables untuk menyimpan array numpy Anda. Numpy Save lebih ringan.
Buka masalah, atau mengobrol dengan saya direktori di gitter di sini https://gitter.im/speedtorch
Saya mencari lebih banyak fungsionalitas di sekitar CPU cepat -> transfer GPU. Jika Anda memiliki ide, silakan kirim masalah GitHub.
Selain itu, GPU Cupy/yang disematkan CPU dan tensor GPU Pytorch, SpeedTorch juga memiliki tensor CPU yang disematkan Pytorch, dan tensor CPU memmap cupy/disepatkan. Saya belum menemukan penggunaan yang solid untuk tensor semacam ini, tetapi mereka sepenuhnya diberi kode dan tersedia untuk digunakan.
https://github.com/santosh-gupta/speedtorch/tree/master/speedtorch
Salah satu area yang ingin saya lihat adalah jika ada cara untuk mengalami pengurangan memori RAM dengan menggunakan cupy memmaps. Sejauh ini mereka menggunakan ingatan yang sama seperti versi langsung.
ModelFactory ( model_variable , total_classes , embed_dimension , datatype = 'float32' , CPUPinn = False )Membuat switchers untuk variabel model menggunakan cupy. Sakelar variabel dari koleksi embedding lengkap Anda dan koleksi batch model Anda. Setiap variabel membutuhkan switcher sendiri.
Contoh:
uEmbed_switcher = SpeedTorch . ModelFactory ( skip_gram_modelSparse . u_embeddings , total_classes = 50000 , embed_dimension = 128 )Argumen:
model_variable : Variabel spesifik dari model Anda yang ingin Anda buat switcher.
total_classes : Jumlah total embeddings yang akan dilatih.
embed_dimension : Dimensi embeddings.
datatype (Opsional): DataType untuk variabel. Default adalah 'float32'.
CPUPinn (Opsional): Pin koleksi embedding lengkap Anda ke CPU. SPARES memori GPU, tetapi transfer data akan lebih lambat. Default salah.
Metode:
zerosInit() : Menginisialisasi koleksi penuh variabel switcher dengan nol:
uniformDistributionInit(low, high) : Menginisialisasi koleksi penuh variabel switcher dengan distribusi yang seragam dari low ke high
normalDistributionInit(mean, stdDev) : Menginisialisasi koleksi penuh variabel switcher dengan distribusi normal dengan rata -rata mean dan standar deviasi stdDev
variableTransformer( batchSize, posPerBatch, negPerBatch = None ) : Mengatur input dummy yang akan digunakan untuk langkah maju model Anda. batchSize adalah ukuran batch Anda, dan posPerBatch adalah jumlah contoh positif per batch. Jika input dummy kedua diperlukan untuk contoh negatif, negPerBatch (opsional) dapat diatur ke jumlah contoh negatif, dan dua input dummy akan dikembalikan, bukan satu.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : Switches Embeddings dari koleksi embeddings penuh ke embeddings model Anda. retrievedPosIndexes adalah indeks sampel positif yang akan diambil. Jika sampel negatif juga akan diambil, nilai untuk retrievedNegIndexes juga dapat dilewati.
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) : sakelar embeddings yang diperbarui dari model Anda ke koleksi embeddings penuh. retrievedPosIndexes adalah indeks sampel positif yang diambil. Jika sampel negatif juga diambil, nilai untuk retrievedNegIndexes (opsional) juga dapat dilewati.
saveCupy(saveFileName) : Simpan tensor ke file .npy.
loadCupy(loadFileName) : Muat tensor dari file .npy.
getNumpyVersion : Dapatkan Tensor versi numpy.
OptimizerFactory( given_optimizer, total_classes, embed_dimension, model, variable_name, dtype='float32' , CPUPinn = False)
Membuat switchers untuk variabel pengoptimal menggunakan cupy. Sakelar variabel dari koleksi embedding lengkap Anda dan koleksi batch pengoptimal Anda. Setiap variabel membutuhkan switcher sendiri.
Contoh:
uAdagrad_switcher = SpeedTorch . OptimizerFactory ( given_optimizer , total_classes , embed_dimension , model , variable_name , dtype = 'float32' , CPUPinn = False )Argumen:
given_optimizer : Pengoptimal diinisialisasi dengan bobot model Anda. Jika menggunakan untuk pelatihan embeddings, ingatlah untuk mengatur parameter sparse menjadi False . Saat ini, pengoptimal yang didukung adalah Sparseadam, Adadelta, Adamax, Adam, Adamw, ASGD, dan RMSProp. RPROP juga diselesaikan, tetapi membutuhkan langkah maju pertama, dan loss.backward() langkah yang harus diselesaikan untuk menginisialisasi instance OptimizerFactory. Hal ini disebabkan oleh pengoptimal RPROP yang membutuhkan gradien parameternya untuk inisialisasi.
total_classes : Jumlah total embeddings yang akan dilatih.
embed_dimension : Dimensi embeddings.
model : Instance dari model Anda.
variable_name : Nama yang tepat dari variabel yang ditentukan dalam model Anda.
dtype (Opsional): Jenis data variabel Anda. Default adalah 'float32'
CPUPinn (Opsional): Pin koleksi berat variabel pengoptimal penuh Anda ke CPU. SPARES memori GPU, tetapi transfer data akan lebih lambat. Default salah.
Metode:
optInit : Menginisialisasi pengoptimal variabel switcher.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : sakelar bobot variabel pengoptimal dari koleksi bobot penuh ke tensor berat pengoptimal. retrievedPosIndexes adalah indeks sampel positif yang akan diambil. Jika sampel negatif juga akan diambil, nilai untuk retrievedNegIndexes juga dapat dilewati.
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) : sakelar bobot variabel pengoptimal dari pengoptimal Anda ke koleksi bobot penuh. retrievedPosIndexes adalah indeks sampel positif yang diambil. Jika sampel negatif juga diambil, nilai untuk retrievedNegIndexes (opsional) juga dapat dilewati.
Membuat tensor yang fungsi utamanya adalah mentransfer isinya ke variabel Pytorch Cuda.
DataGadget( fileName, CPUPinn=False)
Argumen:
fileName : lokasi data .npy file yang akan dibuka
CPUPinn : (Opsional): Pin data Anda ke CPU. Default salah.
Metode:
getData(indexes) : Mengambil data dalam format yang siap diterima oleh variabel Pytorch CUDA. indexes adalah indeks tensor untuk mengambil data dari.
insertData(dataObject, indexes) : Masukkan data dari variabel Pytorch CUDA. dataObject adalah data tensor variabel variabel Pytorch CUDA dari mana data tersebut akan dikembalikan, dan indexes tensor untuk mengambil data dari.
saveCupy(saveFileName) : Simpan tensor ke file .npy.
loadCupy(loadFileName) : Muat tensor baru dari file .npy.
getNumpyVersion : Dapatkan Tensor versi numpy.
Silakan lihat buku catatan ini tentang cara menggunakan gadget data
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttjqxeifhobxxf
PytorchModelFactory ( model_variable , total_classes , embed_dimension , datatype = 'float32' , deviceType = 'cuda' , pinType = False )Membuat switchers untuk variabel model menggunakan tensor pytorch. Sakelar variabel dari koleksi embedding lengkap Anda dan koleksi batch model Anda. Setiap variabel membutuhkan switcher sendiri.
Contoh:
uEmbed_switcher = SpeedTorch . PytorchModelFactory ( skip_gram_modelSparse . u_embeddings , total_classes = 50000 , embed_dimension = 128 )Argumen:
model_variable : Variabel spesifik dari model Anda yang ingin Anda buat switcher.
total_classes : Jumlah total embeddings yang akan dilatih.
embed_dimension : Dimensi embeddings.
datatype (Opsional): DataType untuk variabel. Default adalah 'float32'.
deviceType (Opsional): Setel perangkat ke 'CUDA' atau 'CPU'. Default adalah 'cuda'
pinType (Opsional): Jika perangkat diatur ke 'CPU', Anda dapat menentukan menggunakan memori yang disematkan. Default adalah 'false'.
Metode:
zerosInit() : Menginisialisasi koleksi penuh variabel switcher dengan nol:
uniformDistributionInit(low, high) : Menginisialisasi koleksi penuh variabel switcher dengan distribusi yang seragam dari low ke high
normalDistributionInit(mean, stdDev) : Menginisialisasi koleksi penuh variabel switcher dengan distribusi normal dengan rata -rata mean dan standar deviasi stdDev
customInit(initFunction, *args) : Gunakan inisialisasi pytorch apa pun untuk koleksi penuh variabel switchers. Lulus inisialisasi menggunakan initFunction dan argumen yang sesuai menggunakan *args .
variableTransformer(batchSize, posPerBatch, negPerBatch = None ) : Mengatur input dummy yang akan digunakan untuk langkah maju model Anda. batchSize adalah ukuran batch Anda, dan posPerBatch adalah jumlah contoh positif per batch. Jika input dummy kedua diperlukan untuk contoh negatif, negPerBatch (opsional) dapat diatur ke jumlah contoh negatif, dan dua input dummy akan dikembalikan, bukan satu.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : Switches Embeddings dari koleksi embeddings penuh ke embeddings model Anda. retrievedPosIndexes adalah indeks sampel positif yang akan diambil. Jika sampel negatif juga akan diambil, nilai untuk retrievedNegIndexes juga dapat dilewati.
afterOptimizerStep(retrievedPosIndexes , retrievedNegIndexes = None) : sakelar embeddings yang diperbarui dari model Anda ke koleksi embeddings penuh. retrievedPosIndexes adalah indeks sampel positif yang diambil. Jika sampel negatif juga diambil, nilai untuk retrievedNegIndexes (opsional) juga dapat dilewati.
saveTorch(saveFileName) : Simpan tensor untuk mengajukan menggunakan torch.save
loadTorch(loadFileName) : Load Tensor Menggunakan Torch.Load
getNumpyVersion : Dapatkan Tensor versi numpy.
PytorchOptimizerFactory( given_optimizer, total_classes, embed_dimension, model, variable_name, dtype='float32', deviceType = 'cuda', pinType = False)
Membuat switchers untuk variabel pengoptimal menggunakan tensor pytorch. Sakelar variabel dari koleksi embedding lengkap Anda dan koleksi batch pengoptimal Anda. Setiap variabel membutuhkan switcher sendiri.
Contoh:
uAdagrad_switcher = SpeedTorch . PytorchOptimizerFactory ( given_optimizer , total_classes , embed_dimension , model , variable_name , dtype = 'float32' )Argumen:
given_optimizer : Pengoptimal diinisialisasi dengan bobot model Anda. Jika menggunakan untuk pelatihan embeddings, ingatlah untuk mengatur parameter sparse menjadi False . Saat ini, pengoptimal yang didukung adalah Sparseadam, Adadelta, Adamax, Adam, Adamw, ASGD, dan RMSProp. RPROP juga diselesaikan, tetapi membutuhkan langkah maju pertama, dan loss.backward() langkah yang harus diselesaikan untuk menginisialisasi instance OptimizerFactory. Hal ini disebabkan oleh pengoptimal RPROP yang membutuhkan gradien parameternya untuk inisialisasi.
total_classes : Jumlah total embeddings yang akan dilatih.
embed_dimension : Dimensi embeddings.
model : Instance dari model Anda.
variable_name : Nama yang tepat dari variabel yang ditentukan dalam model Anda.
dtype (Opsional): Jenis data variabel Anda. Default adalah 'float32'
deviceType (Opsional): Setel perangkat ke 'CUDA' atau 'CPU'. Default adalah 'cuda'
pinType (Opsional): Jika perangkat diatur ke 'CPU', Anda dapat menentukan menggunakan memori yang disematkan. Default adalah 'false'.
Metode:
optInit : Menginisialisasi pengoptimal variabel switcher.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : sakelar bobot variabel pengoptimal dari koleksi bobot penuh ke tensor berat pengoptimal. retrievedPosIndexes adalah indeks sampel positif yang akan diambil. Jika sampel negatif juga akan diambil, nilai untuk retrievedNegIndexes juga dapat dilewati.
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) : sakelar bobot variabel pengoptimal dari pengoptimal Anda ke koleksi bobot penuh. retrievedPosIndexes adalah indeks sampel positif yang diambil. Jika sampel negatif juga diambil, nilai untuk retrievedNegIndexes (opsional) juga dapat dilewati.
Jika Anda menggunakan SpeedTorch dalam penelitian Anda atau ingin mengutip, silakan mengutip:
@misc {
title = {speedTorch},
penulis = {santosh gupta},
howpublished = { url {github.com/santosh-gupta/speedtorch}},
tahun = {2019}
}