3

numpy에서 두 개의 큰 행렬의 모든 요소를 ​​만들고 곱한 다음 합계합니다. 나는 두 가지 방법, 루프 및 multiprocessing 모듈 (아래의 스 니펫 참조)을 사용하여이 작업을 몇 백 번 수행합니다.python-multiprocessing/multithreading에서 누락 된 점은 무엇입니까?

def worker_loop(n): 
    for i in n: 
    mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i])) 

def worker(i): 
    mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i])) 

n = range(100,300) 

pool = ThreadPool(2) 
pool.map(worker, n) 
pool.close() 
pool.join() 

worker_loop(n) 

시간을 측정하면 루프multiprocessing보다 빠르다는 것을 알 수 있습니다. 나는 또한 성공하지 못한 threading 모듈을 시험해 보았습니다. (그 다음은 나쁜 아이디어라고 읽었습니다.) 더 읽기 here

이미지, 라벨, 테두리 상자를 변환해야하기 때문에 멀티 스레딩으로 실험을 시작했습니다 ... tfrecords에. 그 때문에 나는 tensorflow/inception 파일을 공부하고있다. (원한다면 build_imagenet_data.py, line 453). 여기서 멀티 스레딩이 작동하는 이유는 그것이 멀티 스레딩을 사용하는 이유입니다. 다음과 같이이 말하는

, 내 질문에 내가 내 코드에서 누락하고있는 무슨

  • , 넣어 수 있습니다; 작은 수정으로 무언가를 성취 할 수 있습니까?
  • tensorflow가 C++ 및 CUDA로 작성 되었기 때문에 예제가 시작되었습니다.
  • numpy, tensorflow 등과 같은 다중 처리 또는 다중 스레딩을 사용하는 것이 바람직한 경우는 언제입니까?

답변

3

항상 약간의 오버 헤드 (동기화, 데이터 준비, 데이터 복사 및 공동 작업)가 있습니다.

하지만 : 좋은 설정 주어진 NumPy와 당신의 행렬 - 벡터 및 벡터 벡터 작업이 이미을 다중 스레드, NumPy와, MATLAB 및 아마 tensorflow의 CPU-을 포함하여 모든 곳에서 사용되는 기술 표준의 상태 인 (BLAS를 사용하여 백엔드, 다른 구현이 있지만).

따라서 BLAS가 모든 코어를 차지할 수 있다면 (큰 크기로 쉽게) 오버 헤드 만 볼 수 있습니다.

그렇습니다. 텐서 플로는 CPU 백엔드를위한 C/C++/Fortran과 BLAS 중 하나 이상과 GPU를 타겟팅 할 때 일부 Cuda-libs 중 적어도 하나에 의해 구현 될 것입니다. 이는 그래디언트 계산 및 최적화 계산과 같은 핵심 알고리즘이 외부 병렬 처리 (모든 유스 케이스의 99.9 %)를 필요로하지 않는다는 것을 의미합니다.

+0

그리고 두 번째 질문에 대답하기 위해 무거운 I/O 바인딩 작업을 수행하지 않는 한 numpy 또는 tensorflow로 다중 처리 또는 다중 스레딩을 사용하는 것은 좋지 않습니다. Tensorflow는 실제로 대기열 주자를 통해 이러한 우연성을 지원합니다. 실제 계산의 경우, tensorflow와 numpy는 이미 모든 코어에 부하를 분산시킬 수 있습니다. –

+1

내가 아는 한 tensorflow는 Eigen을 사용하는데, 기본적으로 자체 (고도로 최적화 된) 저수준 루틴을 사용합니다. 물론, 이것은 sascha의 대답의 요지를 바꾸지 않습니다. – dseuss

+0

@dseuss 흥미 롭습니다. 비록 모든 BLAS-libs에 대한 지원이 있지만 새로운 벤치 마크에서는 Eigen의 공식 FAQ (구식 벤치 마크 및 다소 단일 코어로 제한됨)에도 불구하고 이들이 더 빠르다는 것을 보여줄 것 같습니다. – sascha

관련 문제