non_blocking=False 's 제안은 non_blocking=True 여야합니다.tar 형식 및 IterableDataset 에 따라 데이터 판독 값을 가속화하는 아이디어가 보충됩니다. 메모
원본 문서 : https://www.yuque.com/lart/ugkv9f/ugysgn
성명서 : 대부분의 컨텐츠는 Zhihu 및 기타 블로그에서 공유에서 비롯되며 여기에 컬렉션으로 만 나열됩니다. 더 많은 제안을 환영합니다.
Zhihu 답변 (오신 것을 환영합니다) :
resize 과 같은 일부 고정 작업을 고려하고 미리 저장하고 교육 중에 직접 사용할 수 있습니다.NVIDIA/DALI 사용할 수 있습니다.opencv 는 일반적으로 PIL 보다 빠릅니다.PIL 의 게으른 하중 전략은 opencv 의 imread 보다 open 보이지만 실제로는 데이터를 완전히로드하지는 않습니다. open 에서 반환 된 객체에서 수동으로 load() 로드 데이터를 호출 할 수 있습니다. 현재 속도는 합리적입니다.jpeg 읽기의 경우 jpeg4py 사용해 볼 수 있습니다.bmp 그래프를 저장합니다 (디코딩 시간을 줄이십시오). 대규모 소형 파일 판독 값의 경우 지속적으로 읽을 수있는 연속 파일 형식으로 저장할 수 있습니다. TFRecord (Tensorflow) , recordIO , hdf5 , pth , n5 , lmdb 등을 고려할 수 있습니다.
TFRecord : https://github.com/vahidk/tfrecordlmdb 데이터베이스 :Tar 파일 및 IterableDataset 기반으로 구현 다음 반복에 필요한 데이터를 미리 읽습니다. 사용 사례 :
--cache .기계식 하드 디스크는 NVME 고체 상태로 대체됩니다. Pytorch의 Dataloader에서 닭 피를 제공하는 방법을 참조하십시오 -MKFMiku의 기사 -ZHIHU
교육에서 원래 정확도 ( FP32 ) 표현 대신 저 안전 ( FP16 또는 INT8 , 이진 네트워크 및 3 값 네트워크) 표현이 사용됩니다.
일정량의 비디오 메모리를 절약하고 속도를 높일 수 있지만 평균 및 합계와 같은 안전하지 않은 작업에주의하십시오.
NVIDIA/Apex 가 제공하는 혼합 정확도 지원.torch.cuda.amp 제공하기 시작합니다. 더 큰 배치는 고정 시대의 경우 훈련 시간이 짧아지는 경향이 있습니다. 그러나 큰 배치는 하이퍼 파라미터 설정 및 메모리 사용과 같은 많은 고려 사항에 직면 해 있으며, 이는 많은 관심을 끌었던 또 다른 영역입니다.
torch.backends.cudnn.benchmark = True 설정 루프가 계산 속도를 높이기 전에 true. 커널 크기가 다른 컨볼 루션을 계산하는 CUDNN 알고리즘의 성능이 다르므로 자동 동굴자는 벤치 마크를 실행하여 최상의 알고리즘을 찾을 수 있습니다. 입력 크기가 자주 변경되지 않을 때이 설정을 활성화하는 것이 좋습니다. 입력 크기가 자주 변경되면 Autotuner를 너무 자주 벤치마킹해야하므로 성능을 해칠 수 있습니다. 앞뒤로 전파 속도를 1.27 배에서 1.70x로 증가시킬 수 있습니다.pin_memory=True .num_worker 의 경우 PyTorch SpeedUp Guide -Yunmeng의 기사 -Zhihu에서 자세한 토론을 찾을 수 있습니다.set_to_none=True 설정하고 성능을 향상시킬 수 있지만 문서에 보이는 일부 동작을 변경할 수 있습니다. memset model.zero_grad() 또는 optimizer.zero_grad() 통해 모든 매개 변수에서 수행됩니다. 그러나 Gradient가 읽지 None , 작곡 memset 아닌 것입니다. 그라디언트는 "쓰기 전용"작업을 사용하여 업데이트되므로 None 는 더 빠릅니다.eval 모드를 사용하고 torch.no_grad 사용하여 그라디언트 계산을 끄십시오.DataParallel DistributedDataParallel 로 교체하십시오. Multi-GPU의 경우, 단일 노드 만 DataParallel DistributedDataParallel 여러 프로세스에 적용되고 각 GPU에 대해 하나를 생성하여 Python Global Interpreter Lock (GIL)을 우회하고 속도를 높이기 때문에 DistributedDataParallel 항상 선호됩니다. forward 별도로 사용되므로 사용하지 않는 변수를 초기화하지 마십시오. 사용하지 않기 때문에 초기화되지 않습니다.@torch.jit.script , pytroch jit를 사용하여 포인트 별 작업을 단일 CUDA 커널에 융합하십시오. Pytorch는 큰 치수로 텐서의 작동을 최적화합니다. Pytorch의 작은 텐서에서 너무 많은 작업을 수행하는 것은 매우 비효율적입니다. 따라서 가능한 경우 모든 계산 작업을 배치로 다시 작성하면 소비를 줄이고 성능을 향상시킬 수 있습니다. 배치 작업을 수동으로 구현할 수없는 경우 TorchScript를 사용하여 코드의 성능을 향상시킬 수 있습니다. Torchscript는 Python 기능의 하위 집합이지만 Pytorch가 Pytorch에 의해 검증 된 후 Pytorch는 자동으로 Torchscript 코드를 최적화하여 JTT (Just Intment) 컴파일러를 통해 성능을 향상시킬 수 있습니다. 그러나 더 나은 접근 방식은 배치 작업을 수동으로 구현하는 것입니다.del 사용하여 메모리 풋 프린트를 확보하십시오.torch.from_numpy(ndarray) 또는 torch.as_tensor(data, dtype=None, device=None) 사용하십시오. 자세한 내용과 예방 조치는 해당 문서를 참조하십시오. 소스 및 대상 장치가 CPU 인 경우 torch.from_numpy 및 torch.as_tensor 데이터를 복사하지 않습니다. 소스 데이터가 멍청한 배열 인 경우 torch.from_numpy 사용하십시오 .From_numpy는 더 빠릅니다. 소스 데이터가 동일한 데이터 유형 및 장치 유형의 텐서 인 경우 torch.as_tensor 목록, 튜플 또는 Python의 텐서가 될 수있는 데이터를 복사하지 않을 수 있습니다.non_blocking=True 설정하십시오. 예를 들어, 페이지 잠금 메모리의 CPU 텐서를 CUDA 텐서로 변환하는 등 가능한 경우 비동기 변환을 시도합니다.optimizer.step() 의 시간을 줄입니다.contiguous_pytorch_paramsmemory access cost 약어가 MAC 작고 모델 속도가 가장 빠릅니다.element-wise 운영 감소 : element-wise 운영에 의해 가져온 시간 소비는 플롭에 반영된 값보다 훨씬 크므로 element-wise 운영은 가능한 한 최소화되어야합니다. depthwise convolution 또한 낮은 플롭과 높은 Mac의 특성을 가지고 있습니다. 원래 정확도 ( FP32 ) 표현을 대체하기 위해 추론에 저전치 ( FP16 또는 INT8 , 이진 네트워크 및 3 값 네트워크) 표현을 사용하십시오.
TensorRT 는 NVIDIA가 제안한 신경망 추론 엔진으로, 훈련 후 8 비트 양자화를 지원합니다. 크로스-엔트로피 기반 모델 양자화 알고리즘을 사용하여 두 분포 사이의 차이 정도를 최소화합니다.Distiller Pytorch를 기반으로 한 오픈 소스 모델 최적화 도구이며 Pytorch의 정량 기술을 자연스럽게 지원합니다.NNI 다양한 정량적 지각 교육 알고리즘을 통합하고 PyTorch/TensorFlow/MXNet/Caffe2자세한 내용은 세 가지 AIS를 참조하십시오. [기타 토크] 현재 모델 정량화에 사용할 수있는 오픈 소스 도구는 무엇입니까?
profile , cProfile 및 hotshot 제공됩니다. 사용 방법은 기본적으로 동일합니다. 모듈이 순수한 파이썬인지 또는 C로 작성되었는지 여부는 아닙니다.원본 문서 : https://www.yuque.com/lart/ugkv9f/nvffyf
수집 : Pytorch의 메모리 (비디오 메모리)를 저장하기위한 팁은 무엇입니까? -zhihu https://www.zhihu.com/question/274635237
inplace 지원하는 작업을 활성화하십시오. 예를 들어, relu inplace=True 사용할 수 있습니다.batchnorm 및 일부 특정 활성화 기능은 inplace_abn 에 포장 될 수 있습니다.각 루프의 끝에서 손실을 삭제하면 비디오 메모리가 거의 저장 될 수 있지만 아무것도 아닌 것보다 낫습니다. 가변 및 메모리 무료 모범 사례에 대한 텐서
일정량의 비디오 메모리를 절약하고 속도를 높일 수 있지만 평균 및 합계와 같은 안전하지 않은 작업에주의하십시오.
NVIDIA/Apex 가 제공하는 혼합 정확도 지원.torch.cuda.amp 제공하기 시작합니다.torch.no_grad 사용하여 코드를 포장하십시오.model.eval() torch.no_grad() 와 같지 않습니다. 'Model.eval ()'vs with torch.no_grad () '.False 로 계산할 필요가없는 변수의 requires_grad 설정하십시오.torch.cuda.empty_cache() 는 del 의 고급 버전입니다. nvidia-smi 사용하면 비디오 메모리에 명백한 변경 사항이 있습니다. 그러나 교육 중 최대 비디오 메모리 사용은 변하지 않는 것 같습니다. 시도 할 수 있습니다 : GPU 메모리 캐시를 어떻게 해제 할 수 있습니까?del 사용하여 불필요한 중간 변수를 삭제하거나 replacing variables 형태를 사용하여 점유를 줄일 수 있습니다. batchsize=64 32의 두 배치로 나누고 두 개의 전달 후 한 번 뒤로 나눕니다. 그러나 batchnorm 및 batchsize 와 관련된 다른 층에 영향을 미칩니다.
Pytorch의 문서에서, 그라디언트 축적 및 혼합 정밀도를 사용하는 예가 언급된다.
그라디언트 축적 기술을 사용하여 분산 교육을 가속화하는데 다음을 참조 할 수 있습니다.
torch.utils.checkpoint 는 Pytorch에서 제공됩니다. 이는 역전 동안 각 체크 포인트 위치에서 전방 전파를 다시 실행하여 달성됩니다.
Sublinear 메모리 비용을 가진 종이 훈련은 Gradient Checkpoint 기술을 기반으로하여 O (n)에서 O (SQRT (N))로 비디오 메모리를 줄입니다. 더 깊은 모델의 경우이 방법이 더 많은 메모리가 저장되고 크게 속도가 느려지지 않습니다.
문서의 관련 장을 팔로우 할 수 있습니다.
비 결정적 알고리즘을 사용하지 마십시오.
pytorch에서, torch.use_deterministic_algorithms() 비 결정적 알고리즘 대신 결정 론적 알고리즘의 사용을 강요 할 수 있으며, 작업이 비 결정적 (및 결정적인 대안이 없음)으로 알려진 경우 오류가 발생합니다.
def seed_torch ( seed = 1029 ):
random . seed ( seed )
os . environ [ 'PYTHONHASHSEED' ] = str ( seed )
np . random . seed ( seed )
torch . manual_seed ( seed )
torch . cuda . manual_seed ( seed )
torch . cuda . manual_seed_all ( seed ) # if you are using multi-GPU.
torch . backends . cudnn . benchmark = False
torch . backends . cudnn . deterministic = True
seed_torch ()https://www.zdaiot.com/mlframeworks/pytorch/pytorch%E9%9A%8F%E6%9C%BA%E7%A7%8D%E5%AD%90/의 참조.
구체적인 세부 사항은 95%의 사람들이 여전히 Pytorch 실수를하고 있음을 보여줍니다. -Serendipity Articles -Zhihu
솔루션은 문서를 참조하십시오.
def seed_worker ( worker_id ):
worker_seed = torch . initial_seed () % 2 ** 32
numpy . random . seed ( worker_seed )
random . seed ( worker_seed )
DataLoader (..., worker_init_fn = seed_worker )