pytorch 잠 금 은 dataloader(훈련 시 카드 사망)

1.문제 설명

2.해결 방안
(1)Dataloader 에 서 는 cv2.imread 를 사용 하지 않 고 그림 을 읽 습 니 다.cv2.imread 를 사용 하면 일련의 불편 함 을 가 져 올 수 있 습 니 다.예 를 들 어 torchvision 과 결합 하여 데 이 터 를 강화 할 수 없 기 때문에 PIL 에 있 는 Image.open 으로 그림 을 읽 는 것 이 좋 습 니 다.(본 례 에 적용 되 지 않 음)
(2)DataLoader 의 매개 변 수 를 numworkers 는 0 으로 설정 되 어 있 지만 데이터 읽 기 가 느 려 져 전체 모델 의 훈련 을 늦 출 수 있 습 니 다.(본 례 에 적용 되 지 않 음)
(3)cv2.imread 를 사용 하여 코드 를 바 꾸 고 싶 지 않 으 면 두 개의 문 구 를 추가 하여 Opencv 의 다 중 스 레 드 를 닫 습 니 다:cv2.setNum Threads(0)와 cv2.ocl.setUseOpenCL(False).이 두 문장 을 첨가 한 후에 모델 의 훈련 에 영향 을 주지 않 는 다.본 례 에 적용 되 지 않 음)
(4)이러한 상황 은 pytorch 다 중 스 레 드 잠 금 에 속 해 야 합 니 다.github에서 이 문제 가 있 는 것 을 보 았 으 나 해결 되 지 않 았 습 니 다.
참고 건의
우선 num 확보works 수량 이 CPU 수량 보다 적 습 니 다(Kubernetes 를 사용 하면 pod 로 설정 합 니 다).그러나 데 이 터 를 다음 교체 에 사용 할 수 있 도록 충분히 높 게 설정 합 니 다.
GPU 가 t 초 안에 모든 교 체 를 실행 하고 모든 dataloader worker 가 하나의 일괄 처 리 를 불 러 오 거나 처리 하 는 데 N*t 초가 필요 하 다 면 numworkers 는 GPU 정 체 를 피하 기 위해 최소한 N 으로 설정 합 니 다.물론 시스템 에는 적어도 N 개의 cpu 가 있어 야 한다.
불 행 히 도 Dataloader 가 K 개의 스 레 드 를 사용 하 는 라 이브 러 리 를 사용 하면 생 성 된 프로 세 스 수 는 num 로 변 합 니 다.workersK = NK。이것 은 컴퓨터 의 cpu 보다 훨씬 많 을 수 있 습 니 다.이것 은 pod 의 흐름 을 줄 이 고 Dataloader 는 매우 느 려 집 니 다.이 로 인해 Dataloader 가 일괄 처 리 를 t 초 마다 되 돌려 주지 않 아 GPU 가 일시 정 지 될 수 있 습 니 다.
K 개의 스 레 드 를 피 하 는 방법 은 OMP 를 통 해NUM_THREADS=1 MKL_NUM_THREADS=1 python train.py 에서 주 스 크 립 트 를 호출 합 니 다.이 는 모든 Dataloader 작업 프로그램 이 하나의 스 레 드 만 사용 할 수 있 도록 제한 하여 기계 가 무 거 운 부담 을 견 디 지 못 하 게 하 는 것 을 피 할 수 있다.당신 은 여전히 충분 한 num 가 필요 합 니 다.workers 는 GPU 의 수 요 를 만족시킨다.
당신 은 아직get_item__모든 워 커 가 짧 은 시간 안에 일괄 처 리 를 완성 할 수 있 도록 코드 를 최적화 합 니 다.워 커 가 일괄 처 리 를 마 친 시간 이 디스크 에서 훈련 데 이 터 를 읽 는 시간(특히 네트워크 저장 소 에서 데 이 터 를 읽 을 때)이나 네트워크 대역 폭(네트워크 디스크 에서 데 이 터 를 읽 을 때)의 영향 을 받 지 않도록 하 십시오.데이터 세트 가 작고 RAM 이 충분 하 다 면 데이터 세트 를 RAM(또는/tmpfs)으로 이동 하고 데 이 터 를 읽 어 빠 른 접근 을 하 는 것 을 고려 할 수 있 습 니 다.Kubernetes 에 대해 서 는 RAM 디스크 를 만 들 수 있 습 니 다.(Kubernetes 에서 empty Dir 를 검색 합 니 다.)
만약 당신 이 당신 의 를 최적화 시 켰 다 면get_item__코드,디스크 접근/네트워크 접근 이 원흉 은 아니 지만 문제 가 발생 할 수 있 습 니 다.더 많은 cpu(Kubernetes pod 를 위해)를 요청 하거나 더 많은 cpu 를 가 진 기계 로 GPU 를 이동 해 야 합 니 다.
또 다른 옵션 은 batch 감소size,이렇게 하면 모든 워 커 가 해 야 할 일이 줄 어 들 고 예비 처 리 를 빨리 완성 할 수 있 습 니 다.다음 선택 은 어떤 경우 에는 사용 되 지 않 는 GPU 메모리 가 있 기 때문에 바람 직 하지 않 습 니 다.
오프라인 으로 사전 처 리 를 해서 모든 워 커 의 부담 을 줄 이 는 것 도 고려 할 수 있다.예 를 들 어 모든 워 커 가 wav 파일 을 읽 고 오디 오 파일 의 보 도 를 계산 하고 있다 면 오프라인 사전 계산 보 도 를 고려 하여 작업 자의 디스크 에서 만 계산 보 도 를 읽 을 수 있 습 니 다.이것 은 모든 워 커 의 작업량 을 줄 일 것 이다.
dataloader 의 설정 pin 도 고려 할 수 있 습 니 다.memory=False。
보충:pytorch 로드 훈련 데이터 세트 dataloader 작업 시간 이 너무 오래 걸 리 는데 어떻게 해결 해 야 합 니까?
필 자 는 pytorch 로드 훈련 데 이 터 를 사용 하여 모델 훈련 을 할 때 데이터 로드 에 너무 많은 시간 이 걸 리 는 것 을 발견 했다.데이터 로드 의 시간 소 모 를 어떻게 단축 시 켜 야 합 니까?관련 문 서 를 조회 한 결과,
실제 조작 과정 을 정리 하면 다음 과 같다.
1.jpg 등 형식의 파일 을 bmp 파일 로 저장 하면 디 코딩 시간 을 낮 출 수 있 습 니 다.
2,dataloader 함수 중 num 증가workers 매개 변 수 는 데 이 터 를 불 러 오 는 스 레 드 수 를 표시 합 니 다.이 시스템 의 CPU 핵심 수 로 설정 하 는 것 을 권장 합 니 다.CPU 가 강하 고 메모리 가 많 으 면 이 수 치 를 더 크게 설정 하 는 것 도 고려 할 수 있 습 니 다.

train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
다음으로 변경:

train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True,num_workers=multiprocessing.cpu_count())
dataloader 를 사용 하여 iter(Dataset)의 읽 기 병렬 에 이 르 렀 지만 GPU 연산 시 비동기 로 데 이 터 를 읽 지 못 했 습 니 다.non 사용 을 고려 할 수 있 습 니 다.blocking 실현.

dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers)
for epoch in range(epochs):
    for batch_idx, (images, labels) in enumerate(dataloader):
        images = images.to(device)
        labels = labels.to(device)
다음으로 변경:

dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers, pin_memory = True)
for epoch in range(epochs):
    for batch_idx, (images, labels) in enumerate(dataloader):
        images = images.to(device, non_blocking=True)
        labels = labels.to(device, non_blocking=True)
주의해 야 할 것 은:pin 만memory=True 그리고 numworkers>0 시 nonblocking 이 효과 가 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기