NVIDIA - Nsight System으로 GPU profilingm, 학습 최적화

2022. 8. 31. 21:49AI/테크 세미나

Techtonic 2021] SDS 발표내용 참고

https://www.youtube.com/watch?v=bbrzuKgqgdc&ab_channel=%EC%82%BC%EC%84%B1SDS 

 

https://marcokhan.tistory.com/249

 

[Ubuntu] Nvidia Nsight compute usage

Nvidia GPU는 최근 크게 여섯가지 아키텍처로 구별할 수 있다. <그림 1> 참고. Compute capability가 높을수록 최신 아키텍처라고 생각하면 될 것 같다. <그림 1> GPU로 CUDA programming을 하면서 GPU Kernel을..

marcokhan.tistory.com

 

Nsight System을 이용하여 GPU profiling 후 연산속도 개선

GPU utility 50% -> 96%와 throughput 450 -> 1000으로 개선

 

1. torch.cuda.nvtx으로 GPU 시간을 측정

시간 측정이 필요한 torch의 모듈을 wrapining하는 방법으로 profiling 수행 (monkey patch방식으로 인터페이스를 추가함)

 

2. NHWC 형식으로 tensor preprocessing 

NVIDIA는 channel last format을 사용하며, channel first 일 경우 transpose 연산으로 overhead 발생

 

2. Pinned memory buffers 사용하기

Dataloader(pin_memory=True)

CPU가 GPU memory로 data를 옮긴후에 GPU가 연산을 한다.

pinned memory buffer를 사용하면 host 간의 copy(pageable -> pin) 를 생략하여 GPU의 data load time(idle) 줄일수 있다.

 

CPU가 host의 memory 내에 있는 data를 GPU memory로 옮기는 과정에서 pageable memory와 pin memory를 사용한다.

속도면에서 pinned memory 가 좋다. 다만 pin memory 할당이 커지면 큰 시스템 메모리 영역을 필요로 하고 GPU idle time과 시스템 메모리는 트레이드 오프 관계가 된다

 

각 함수의 동작

pinned memory buffers : pytorch가 memory copy를 위해서 할당한 영역(pageable -> pinned memory -> GPU memory)

pytorch의 pin_memory 함수 : pageable memory 에서 pin memory 영역으로 tensor를 copy함(host -> host 기능)

일반 malloc(c언어) : pageable memory(host) 할당 

torch.cuda 함수: pageable memory -> pinned memory로 copy (( 같은 host 내에서의 복사이므로 불필요한 단계))

cudaMemcpy : host에서 GPU로 data 전달

 

 

pin memory : memory에 직접 mapping 

pageable memory : virtual memory 

DataLoader와  Pin memory & workers

https://cvml.tistory.com/24

 

num_workers & pin_memory in DataLoader

pytorch를 이용해 딥러닝 모델을 학습시킬 때 custom dataset을 이용할 경우 torch.utils.data.Dataset으로 데이터셋을 정의하고(input data type, augmentation 등) torch.utils.data.DataLoader로 어떻게 데이터..

cvml.tistory.com

GPU의 memory 동작 방식

https://blog.naver.com/julie_eun1014/221116312880

 

CUDA 기반의 GPU Memory 이해하기

1. 메모리 구조 메모리 사용은 커널과 더불어 항상 중요하게 고려해야 하는 요소입니다. 그래픽 메모리는 ...

blog.naver.com

Techtonic SDS 발표자료 참고

 

 

GPU 관련 용어

host : CPU

device : GPU 

d_ : GPU 연산에 사용하는 변수 명

h_ : host에서 사용하는 변수명

kernel : device에서 실행되는 함수

grid : device에서 생성되는 모든 thread

global memory : device의 DRAM으로서, kernel lauch전에 host는 device에 global memory를 할당하고 data를 전달해야함

CUDA : GPU 동작을 위한 API

grid : SW적으로 구성되어 dimension을 설정하면서 각 1개의 kernel 함수를 수행함(내부에 block들로 구성)

block : grid에 속하며 block - thread 구조를 가진다 (1개이상의 thread로 구성됨)

SM : streaming Multiprocessor 

global memory : GPU DRAM에 있는 framebuffer

 

GPU 연산 과정

1. device memory 할당

2. host data를 device로 copy (host-to-device transfer)

3. kernel launch (연산을 수행하는 device의 커널 함수 호출, GPU on-chip 으로 GPU program load(caching),  excution)

4. 연산을 마친 device data를 host로 copy (device-to-host transfer)

5. device memory 해제

CUDA 실행과정

host와 device 영역의 소스 파일을 NVCC(NVIDA C Compiler)로 컴파일한후에 실행된다. (일반 compiler로는 할수 없음)

host에서 CPU serial code를 실행하고 device에서 parallel  device code(launched)를 실행하는 순서를 반복한다

 

CUDA 고수의 블로그 참고

https://junstar92.tistory.com/244?category=986472 

 

CUDA 프로그래밍 기초 (예제 : vector addition)

References CUDA Toolkit Documentation Programming Massively Parallel Processors Contents 간략한 GPU와 CUDA 요약 데이터 병렬화(Data Parallelism) CUDA 프로그램 구조 벡터 덧셈(vector addition) 예제 Ker..

junstar92.tistory.com

 

'AI > 테크 세미나' 카테고리의 다른 글

효율적인 Auto labeling by Active Learning  (0) 2022.09.01