더 빠른 고정 된 CPU 텐서 <-> GPU Pytorch variABE 전송 및 GPU 텐서 <-> GPU Pytorch 변수 전송.
일부 시스템의 경우 고정 된 Pytorch CPU 텐서를 사용하는 것이 Cupy Tensors를 사용하는 것보다 빠르기 때문에 (자세한 내용은 '작동하는 방법' cpu 참조) PytorchModelFactory 및 PytorchOptimizerFactory 텐서를 cuda 또는 cpu 로 설정할 수있는 일반적인 Pytorchmodelfactory 및 PytorchoptimizerFactory를 만들었습니다. 원래 GPUPytorchModelFactory 및 GPUPytorchOptimizerFactory 클래스는 여전히 라이브러리에 있으므로 SpeedTorch를 사용하는 기존 코드에 영향을 미치지 않아야합니다. 이 새로운 클래스를 포함하도록 문서가 업데이트되었습니다.
이 라이브러리는 CPU에 고정 된 Cupy 텐서 주위에 회복되며, 이는 일반 Pytorch 고정 된 CPU 텐서 캔보다 3.1 배 더 빠른 CPU-> GPU 전송 및 410 배 빠른 GPU-> CPU 전송을 달성 할 수 있습니다. 속도는 데이터 양과 시스템의 CPU 코어 수에 따라 다릅니다 (자세한 내용은 작동 방식 섹션 참조).
라이브러리에는 임베딩 훈련 기능이 포함되어 있습니다. CPU RAM에 유휴 상태가있는 동안 GPU RAM을 절약 할 수 있습니다.
나는 처음 에이 라이브러리를 만들어 많은 수의 임베딩을 훈련시키는 데 도움이되었으며, GPU는 RAM을 잡는 데 어려움을 겪을 수 있습니다. 이를 위해, 나는 CPU에 일부 임베딩을 호스팅함으로써이를 달성하는 데 도움이 될 수 있음을 발견했습니다. 임베딩 시스템은 스프라세 훈련을 사용합니다. 총 전구체의 일부만이 포워드/업데이트 단계에 참여하고 나머지는 유휴 상태입니다. 그래서 훈련 단계에서 유휴 매개 변수를 GPU에서 유지하지 않겠습니까? 이를 위해서는 빠른 CPU-> GPU 전송이 필요했습니다.
전체 배경은 DevPost 페이지를 참조하십시오
https://devpost.com/software/speedtorch-6w5unb
빠른 CPU-> GPU를 사용하면 이전에 사람들이 불가능했다고 생각했던 기능을 위해 많은 재미있는 방법을 개발할 수 있습니다.
? ️ CPU에서 빠른 데이터 전송을 위해 SpeedTorch를 데이터 파이프 라인에 통합하여 CPU <-> gpu
? ️ CPU 스토리지를 통한 교육 매개 변수 확대. CPU RAM이 충분한 한 GPU RAM에 대해 걱정할 필요없이 수많은 임베딩을 호스팅 할 수 있습니다.
? ️ Adadelta, Adamax, RMSProp, Rprop, ASGD, Adamw 및 Adam Optimizers를 사용하여 드문 임베드 훈련을 사용하십시오. 이전에는 Spraseadam, Adagrad 및 SGD만이 드문 구배를 직접 지원하기 때문에 적합했습니다.
(Pytorch 개발자 중 한 명인 Pytorch 개발자 중 한 명이 원래 벤치 마킹 코드에서 약간의 사소한 버그를 지적했습니다. 값과 코드가 업데이트되었습니다)
다음은 SpeedTorch 대 Pytorch 텐서를 통한 전송을 비교하는 노트북이 CPU 및 Cuda 텐서를 모두 고정시킵니다. 모든 테스트는 Tesla K80 GPU와 2 개의 코어 CPU를 갖는 콜라 랩 인스턴스로 수행되었습니다.
업데이트 10-17-19 : Google Colab은 이제 4 개의 핵심 CPU와 함께 표준 이므로이 노트북은 CPU 코어 수가 증가함에 따라 Pytorch의 인덱싱 커너가 더 효율적이기 때문에 아래에보고 된 것과 다른 결과를 제공합니다.
https://colab.research.google.com/drive/1pxhbmbzqtiq_nlfguianpf_mfpiqskks
이 노트북은 131,072 Float32 Dimension 128의 삽입 된 데이터 전송을 Cupy/Pytorch 텐서 및 Pytorch 변수로 N = 100으로 전송합니다. Google Colab의 CPU에는 4 개의 코어가 있으며 이는 전송 속도에 영향을 미칩니다. 코어 수가 많을수록 CPU는 SpeedTorch 사용에 대한 발전이 적습니다.
아래 표는 결과의 요약입니다. Pytorch Cuda 텐서에서 Cuda Pytorch Embedding 변수로 데이터를 전송하는 것은 SpeedTorch와 동등한 것보다 빠르지 만 다른 모든 전송 유형의 경우 SpeedTorch가 더 빠릅니다. 그리고 Cuda Pytorch 임베딩으로 전달되는 두 단계의 합의에 대해, Speedtorch는 일반 GPU 및 CPU 고정 텐서 모두와 동등한 Pytorch보다 빠릅니다.
Colab의 다른 사례는 다른 속도 결과를 초래한다는 것을 알았으므로 이러한 결과를 검토하는 동안이를 명심하십시오. Colab 노트북의 개인 실행은 다른 값을 초래할 수 있지만 결과의 자석 순서는 일반적으로 동일합니다.
다음 테이블의 전송 시간은 몇 초 만에 제공됩니다. 이 벤치마킹은 CPU가 2 개의 코어를 갖는 콜랩 인스턴스로 미리 형성되었습니다. Colab에는 4 개의 핵심 CPU 인 유료 인스턴스의 프로 버전이 있으므로 다음 벤치마킹은 해당 인스턴스에 대해 반영되지 않습니다.
| 텐서 유형 | cuda pytorch 변수 | 비교 |
|---|---|---|
| 스피드 토치 (CUDA) | 0.0087 | Pytorch와 같은 6.2 배 더 느립니다 |
| SpeedTorch (pinnedcpu) | 0.0154 | Pytorch와 같은 3.1 배 더 빠릅니다 |
| Pytorch (Cuda) | 0.0014 | SpeedTorch와 같은 SpeedTorch보다 6.2 배 빠릅니다 |
| Pytorch (pinnedcpu) | 0.0478 | SpeedTorch와 같은 3.1 배 더 느립니다 |
| 텐서 유형 | Cuda Pytorch 변수에서 | 비교 |
|---|---|---|
| 스피드 토치 (CUDA) | 0.0035 | Pytorch 동등성보다 9.7 배 빠릅니다 |
| SpeedTorch (pinnedcpu) | 0.0065 | Pytorch와 같은 410x 더 빠릅니다 |
| Pytorch (Cuda) | 0.0341 | SpeedTorch와 같은 SpeedTorch보다 9.7 배 더 느립니다 |
| Pytorch (pinnedcpu) | 2.6641 | SpeedTorch와 같은 410x 더 느립니다 |
| 텐서 유형 | Cuda Pytorch 변수의 합계 | 비교 |
|---|---|---|
| 스피드 토치 (CUDA) | 0.0122 | Pytorch와 같은 2.9 배 빠릅니다 |
| SpeedTorch (pinnedcpu) | 0.0219 | Pytorch 동등한 것보다 124 배 빠릅니다 |
| Pytorch (Cuda) | 0.0355 | SpeedTorch보다 2.9 배 느립니다 |
| Pytorch (pinnedcpu) | 2.7119 | SpeedTorch보다 124 배 느립니다 |
Pytorch Cuda Optimizers로부터 전송을 위해 유사한 벤치 마크가 계산되었다. 결과는 기본적으로 동일합니다. 여기에 Optimizers 벤치마킹에 사용되는 노트가 있습니다.
https://colab.research.google.com/drive/1y2nehd8xj-ixfjkjkj2qwua_ujqjbbhhj5
Speedtorch의 텐서는 일반적으로 Pytorch보다 빠르지 만 Speedtorch의 텐서는 더 많은 메모리를 사용하는 것입니다. 그러나 데이터 전송이 더 빨리 발생할 수 있으므로 SpeedTorch를 사용하여 GPU 및 CPU 모두에서 매개 변수를 유지하여 아키텍처에서 훈련 된 임베딩 수를 보강 할 수 있습니다.
이 표는 Google Colab에서 수행 한 벤치마킹 요약입니다. 내 경험을 통해 Colab의보고 된 메모리 값에는 +-0.30 GB가 약간의 차이가있는 것 같습니다. 값은 10,000,000x128 Float32 텐서를 유지하는 것입니다.
| 텐서 유형 | CPU (GB) | GPU (GB) |
|---|---|---|
| Cupy pinnnedcpu | 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의 시간은 <-> Pytorch Cuda 변수가 Cupy 동등한 속도만큼 빠르지 않지만 속도는 여전히 작동합니다. 따라서 메모리가 여전히 우려되는 경우, 두 세계의 최선의 접근 방식은 Speedtorch의 Cupy CPU가 CPU에 매개 변수를 저장하기 위해 Speedtorch의 Cupy CPU 고정 텐서와 Speedtorch의 Pytorch GPU 텐서를 저장하여 GPU에 매개 변수를 저장하는 것입니다.
이것은 각 변수 유형의 메모리의 양을 측정하는 데 사용한 노트북입니다. https://colab.research.google.com/drive/1zky7pyupaidrnx2hdtbujwo8juy0xkue colab에서 이것을 사용하는 경우 각 텐서 생성 후에 환경을 다시 시작하여 다음 텐서에 대한 조치를 취해야합니다.
CPU <-> GPU 전송의 경우 전송되는 데이터의 양과 보유한 코어 수에 따라 다릅니다. 일반적으로 1-2 CPU Cores SpeedTorch의 경우 훨씬 빠릅니다. 그러나 CPU 코어의 수가 증가함에 따라 Pytorch의 CPU <-> GPU 인덱싱 작업이 더욱 효율적입니다. 이에 대한 자세한 내용은 다음 '작동 방식'섹션을 참조하십시오. 시스템에서 속도 이점을 얻는 지 쉽게 확인할 수있는 방법은 시스템에서 벤치마킹 코드를 실행하지만 응용 프로그램에서 작업 할 금액을 반영하도록 데이터 양을 변경하십시오.
GPU <-> GPU 전송의 경우 바닐라 Pytorch에서 일반 인덱싱 표기법을 사용하는 경우 SpeedTorch가 Pytorch의 인덱싱 작업에서 버그를 우회하기 때문에 모든 시스템이 속도가 높아집니다. 그러나 야간 버전을 사용하거나 다른 인덱싱 개념을 사용하는 경우이 버그를 피할 수 있습니다. 자세한 내용은 '작동 방식'섹션을 참조하십시오.
업데이트 9-20-19 : 처음에는 이것이 왜 Pytorch 텐서를 사용하는 것보다 빠른지 전혀 몰랐습니다. 나는 우연히 속도 이점을 우연히 발견했다. 그러나 Pytorch 포럼의 Pytorch 개발자 중 한 명이이를 지적했습니다.
더 나은 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 게시물을 참조하십시오.
https://discuss.pytorch.org/t/introducing-speedtorch-4x-speed-cpu-transfer-110x-gpu-cpu-transfer/56147/2
Pytorch 엔지니어가 Cupy Indexing Kernals의 방법에 대한 자세한 분석을 제공하여 특정 경우 속도를 높이게합니다. 더 빨라지는 전송 자체가 아니라 사용중인 인덱싱 커너입니다.
Cupy의 메모리 관리가 어떻게 작동하는지에 관해서는, 내가 요청한이 두 가지 stackoverflow 질문에 직접 지시합니다. Robert Crovella는 자세한 설명을했을뿐만 아니라 Cupy에 대한 자신의 메모리 할당자를 개발하여 Cupy 어레이에 고정 메모리를 할당하는 방법을 알아 냈습니다. 이것은 기본적으로 Speedtorch의 핵심 기술입니다.
https://stackoverflow.com/questions/57750125/cupy-outofmemoryerror-when-trying-to-cupy-larger-dimension-npy-files-in-me
https://stackoverflow.com/questions/57752516/how-to-use-cuda-pinned-zero-copy-memory-for-a-memory-mapp-file
SpeedTorch는 PIP 설치 가능입니다. SpeedTorch를 가져 오기 전에 Cupy를 설치하고 가져와야합니다.
!pip install SpeedTorch
import cupy
import SpeedTorch
이 Colab 노트북은 데이터 가제트를 사용하여 SpeedTorch에 데이터를로드하는 방법과 Pytorch Cuda 변수 로이 데이터를 전송하는 방법을 보여줍니다.
https://colab.research.google.com/drive/185z5gi62azxh-eemfrttttttttjqxeifhobxxf
SpeedTorch 사용의 속도 이점을 보려면 Speed Benchmarking Notebook을 참조하십시오.
Speedtorch를 사용하는 방법을 먼저 알아 내려고하는 사람들의 경우 Word2Vec은 기계 학습에서 가장 일반적으로 알려진 알고리즘 중 하나 이므로이 예를 따르는 것이 좋습니다.
https://colab.research.google.com/drive/1apjr3onbgqwm3fbcbkmvwagxidxldxot
노트북은 정기적 인 방법으로 Word2VEC를 훈련시키는 방법을 보여준 다음 SpeedTorch를 사용하여 동일한 데이터를 훈련시키는 방법을 보여줍니다. 임베딩 변수에 포함 된 모든 임베딩이 각 단계에서 업데이트되기 때문에 초기화 중에 sparse=False 설정할 수 있기 때문에 가능합니다.
tl; dr :
정상 훈련 : Pytorch 임베딩 변수에는 모든 임베딩이 포함되어 있습니다. Pytorch Optimizer에는 각 임베딩에 대한 해당 매개 변수 가중치가 모두 포함되어 있습니다.
SpeedTorch Traing : Pytorch Embeddng 변수에는 배치 만 포함됩니다. Pytorch Optimizer에는 해당 배치에 대한 모든 해당 매개 변수 가중치 만 포함됩니다. Sparsetorch 텐서에는 나머지 부분이 포함되어 있으며 각 단계에서 Pytorch 변수와 임베딩/가중치를 교환합니다.
Word2Vec, Glove 또는 Neural Collaborative Filtering과 같은 희소 훈련 알고리즘에서는 전체 매개 변수 (Embeddngs)의 일부만이 모든 단계에서 훈련됩니다. GPU가 원하는 임베딩 크기로 모든 임베딩을 처리 할 수없는 경우 옵션은 고정 된 CPU Cupy Array에서 일부 매개 변수를 호스팅하고 필요에 따라 모델 텐서로 해당 매개 변수를 전송하는 것입니다. 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 드라이브의 공간 제한 때문이었습니다.
참고 : 일반적인 12GB 대신 25GB의 RAM이있는 Colab 노트북 버전이 필요합니다. 이 유형의 인스턴스를 얻으려면 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를 사용하면 대상 임베딩을 CPU에 저장하는 동시에 GPU에 컨텍스트 임베드를 유지하면서 14,886,544 개의 연구 용지 임베딩을 188로 훈련시킬 수 있습니다 (SGD Optimizer가 사용되었으므로 최적화 가중치가 없음).
다음은 노트북에 대한 직접 링크입니다.
https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15_qkr5ylni_gr
참고 : 일반적인 12GB 대신 25GB의 RAM이있는 Colab 노트북 버전이 필요합니다. 이 유형의 인스턴스를 얻으려면 RAM을 압도하여 현재 인스턴스를 충돌시킨 다음 왼쪽 하단 코너의 메모를 업그레이드 할 것인지 묻습니다. Numpy Float 행렬의 크기를 계속 두 배로 늘리는 루프를 만들어이 작업을 수행 할 수 있습니다.
SpeedTorch가 없으면 RuntimeError: CUDA out of memory 오류 전에 Google Colab Tesla K80 GPU에서 94-96의 임베딩 크기 만 사용할 수 있습니다. 다음은 SpeedTorch를 사용하지 않고 교육 버전입니다.
https://colab.research.google.com/drive/1jh7rugeajhdwdgnfwgwg3twm1zjytqu0kr
Cupy GPU 텐서를 사용할 때마다 고정 된 CPU 텐서 전에 이들을 초기화하십시오. 이는 Cupy GPU 텐서의 초기화가 상당한 양의 CPU RAM을 사용하는 것처럼 보이기 때문입니다. 따라서 CPU RAM이 제한되어 있고 이미 메모리에 고정 된 CPU 텐서가있는 경우 Cupy GPU 텐서를 초기화하면 충돌이 발생할 수 있습니다.
GPU 메모리에있는 모든 매개 변수를 장착 할 수 있다면 Pure Pytorch를 사용하여 교육을위한 가장 빠른 옵션이므로 사용하십시오. 그러나 메모리에 모든 매개 변수를 맞출 수 없다면 SpeedTorch의 Cupy Cuda 텐서와 SpeedTorch의 Cupy 고정 된 CPU 텐서 사이에 매개 변수를 분할하십시오 (최적화기도 가중치가 있음을 명심하십시오). 이것은 두 번째로 빠른 옵션입니다. 그러나 여전히 모든 매개 변수를 메모리에 맞출 수 없다면 SpeedTorch의 Cupy 고정 된 CPU 텐서와 SpeedTorch의 Pytorch Cuda 텐서로 매개 변수를 분할하십시오. 이것은 두 옵션보다 느리지 만 GPU 메모리를 덜 사용합니다. 세 번째 옵션의 경우 여기 에이 https://colab.research.google.com/drive/1aqht-hetihxmet1wjqrorc3q9tfjqj19, https://colab.research.google.com/drive/1sakzsahoy6o_u1df_z15 _z15 _Z15_Z.
훈련 후 CUDA 변수를 저장하면 메모리 사용이 증가하고 특히 Cupy와 함께 충돌이 발생할 수 있습니다. 당신이 당신의 램의 한계에 있다면. 이 경우 getNumpyVersion 메소드를 사용하여 Numpy 버전의 텐서를 얻은 다음 Numpy.save 또는 hdpy/pytables를 사용하여 Numpy Array를 저장하십시오. Numpy Save는 더 가볍습니다.
문제를 열거 나 Gitter에서 Me와 채팅하여 https://gitter.im/speedtorch
빠른 CPU-> GPU 전송에 대해 더 많은 기능을 구입하고 있습니다. 아이디어가 있으면 Github 문제를 게시하십시오.
또한 Cupy GPU/고정 된 CPU 및 Pytorch GPU 텐서 인 SpeedTorch는 Pytorch 고정 CPU 텐서 및 Cupy Memmap GPU/Pinned CPU 텐서를 가지고 있습니다. 나는 이런 종류의 텐서에 대해 견고한 용도를 찾지 못했지만 완전히 코딩되어 사용 가능합니다.
https://github.com/santosh-gupta/speedtorch/tree/master/speedtorch
내가보고 싶은 영역 중 하나는 Cupy Ammaps를 사용하여 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() : Zeros로 변수 스위처 전체 컬렉션을 초기화합니다.
uniformDistributionInit(low, high) : 가변 스위처 전체 컬렉션을 초기화하여 low 에서 high 까지 균일 한 분포로 전체 컬렉션을 초기화합니다.
normalDistributionInit(mean, stdDev) stdDev mean 의 평균 및 표준 편차를 가진 정규 분포로 변수 스위처 전체 컬렉션을 초기화합니다.
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를 사용하여 Optimizer 변수를위한 스위처를 만듭니다. 전체 임베딩 컬렉션 및 Optimizer Batch Collection에서 변수를 스위치합니다. 각 변수에는 자체 전환기가 필요합니다.
예:
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 Optimizer 때문입니다.
total_classes : 훈련 할 총량의 총량.
embed_dimension : 임베딩의 치수.
model : 모델 인스턴스.
variable_name : 모델에 정의 된 변수의 정확한 이름입니다.
dtype (선택 사항) : 변수의 데이터 유형. 기본값은 'float32'입니다.
CPUPinn (선택 사항) : 전체 Optimizer Variable Weight Collection을 CPU에 고정하십시오. GPU 메모리를 아끼지 만 데이터 전송이 느려집니다. 기본값은 False입니다.
행동 양식:
optInit : Optimizer 변수 스위처를 초기화합니다.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : 전 스위치 Full Weights Collection에서 Optimizer Weight Tensor 로의 가변 가중치 스위치. retrievedPosIndexes 검색 할 양성 샘플의 지수입니다. 음성 샘플도 검색되는 경우 retrievedNegIndexes (선택 사항)에 대한 값도 전달 될 수 있습니다.
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) : Optimizer에서 Optimizer에서 Full Weights Collection으로 가변 가중치를 스위치합니다. 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-eemfrttttttttjqxeifhobxxf
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'로 설정된 경우 고정 메모리를 사용하여 지정할 수 있습니다. 기본값은 '거짓'입니다.
행동 양식:
zerosInit() : Zeros로 변수 스위처 전체 컬렉션을 초기화합니다.
uniformDistributionInit(low, high) : 가변 스위처 전체 컬렉션을 초기화하여 low 에서 high 까지 균일 한 분포로 전체 컬렉션을 초기화합니다.
normalDistributionInit(mean, stdDev) stdDev mean 의 평균 및 표준 편차를 가진 정규 분포로 변수 스위처 전체 컬렉션을 초기화합니다.
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 텐서를 사용하여 Optimizer 변수를위한 스위처를 만듭니다. 전체 임베딩 컬렉션 및 Optimizer Batch Collection에서 변수를 스위치합니다. 각 변수에는 자체 전환기가 필요합니다.
예:
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 Optimizer 때문입니다.
total_classes : 훈련 할 총량의 총량.
embed_dimension : 임베딩의 치수.
model : 모델 인스턴스.
variable_name : 모델에 정의 된 변수의 정확한 이름입니다.
dtype (선택 사항) : 변수의 데이터 유형. 기본값은 'float32'입니다.
deviceType (선택 사항) : 장치를 'Cuda'또는 'CPU'로 설정하십시오. 기본값은 'cuda'입니다.
pinType (선택 사항) : 장치가 'CPU'로 설정된 경우 고정 메모리를 사용하여 지정할 수 있습니다. 기본값은 '거짓'입니다.
행동 양식:
optInit : Optimizer 변수 스위처를 초기화합니다.
beforeForwardPass(retrievedPosIndexes , retrievedNegIndexes = None) : 전 스위치 Full Weights Collection에서 Optimizer Weight Tensor 로의 가변 가중치 스위치. retrievedPosIndexes 검색 할 양성 샘플의 지수입니다. 음성 샘플도 검색되는 경우 retrievedNegIndexes (선택 사항)에 대한 값도 전달 될 수 있습니다.
afterOptimizerStep( retrievedPosIndexes , retrievedNegIndexes = None) : Optimizer에서 Optimizer에서 Full Weights Collection으로 가변 가중치를 스위치합니다. retrievedPosIndexes 검색된 양성 샘플의 지수입니다. 음성 샘플도 검색된 경우, retrievedNegIndexes (선택 사항)에 대한 값도 전달 될 수 있습니다.
연구에서 SpeedTorch를 사용하거나 인용하고 싶다면 다음과 같이 인용하십시오.
@misc {
title = {speedtorch},
저자 = {Santosh Gupta},
howpublished = { url {github.com/santosh-gupta/speedtorch}},
연도 = {2019}
}