답변

2
  1. 글쎄, 당신은 GPU 시간의 알렉스 인터넷에서 올바른 방법으로 거의 95 %를 생각하고 CPU 시간의 89 %는 길쌈 레이어와 완전히 연결 레이어에 소요된다.

  2. 컨볼 루션 레이어와 완전 연결 레이어는 GEneral 매트릭스 - 매트릭스 곱셈을 나타내는 GEMM을 사용하여 구현됩니다.

  3. 기본적으로 GEMM에서는 행렬 곱셈에 의해 컨볼 루션 출력을 얻을 수있는 방식으로 데이터를 배열하는 im2col()이라는 함수를 사용하여 컨볼 루션을 행렬 곱셈으로 변환합니다.

  4. 이제는 요소 별 컨볼 루션을 직접 수행하는 대신 질문을 할 수 있습니다. 다른 방법으로 데이터를 배열하고 GEMM을 사용하기 위해 단계를 추가하는 이유는 무엇입니까?

  5. 과학 프로그래머는 대형 매트릭스 - 매트릭스 곱셈을 수행하기 위해 수십 년 동안 코드를 최적화했으며, 매우 규칙적인 메모리 액세스 패턴의 이점은 다른 손실보다 뛰어나다. 엔비디아는 CUBLAS 라이브러리의 GEMM의 API를 가지고, 인텔 MKL은 또한

  6. 는 CUDA는에 elementwise의 회선을하고 상상 자체 GEMM의 API가, 메모리는 성능이 아주 나쁜 것 너무 불규칙 것 액세스합니다.

  7. 차례로 Im2col()은 메모리 액세스가 규칙적인 방식으로 데이터를 정렬합니다.

  8. Im2col() 기능은 많은 데이터 중복을 추가하지만 Gemm을 사용하면 성능 이점이이 데이터 중복보다 중요합니다.

  9. 이것은 Neural Nets에서 Im2col() 연산을 사용하는 이유입니다. https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

:

  • 이 링크는 Im2col()가 GEMM의 데이터를 정렬하는 방법을 설명