Python Multiprocessing(Process) 사용한 데이터 처리 속도 개선

 

·       Version : MAC OS, Python 3.X, PIP3

 

대용량 데이터를 효율적으로 처리하기 위해서는 병렬 처리를 활용하는것이 좋다.  파이썬에서 병렬처리를 제공하는 대표적인 라이브러리는 Threading Multiprocessing 모듈이다. Threading 모들은 파이썬의 GIL(Global Interpreter Lock)라는불리우는 잠금 모델을 사용하기 때문에I/O 작업이 아닌 CPU 작업이 많을 경우 오히려 성능이 저하된다. 방식은 Lock 풀고 스레드를 교환하고 다시 Lock 거는 형태의 멀티스레드이기 떄문이다.

파이썬에서는 Multiprocessing 권장하고 있으며,   모듈에는 대표적으로 Pool Process 있지만 이번 글에서는 Process 대해서 다루기로 한다.

 

·       Pool 사용한 처리 속도 개선 : https://sungwookkang.com/1478

 

Process 하나의 프로세스에 하나의 함수를 할당하여 실행한다. Target= 파라메터에 작업을 할당하고, args=(agr1, ) 인수를 할당하여 프로세스 객체를 생성한다. start() 프로세스를 시작하여 join()으로 프로세스의 종료를 기다린다.

import os

import multiprocessing as mp

from multiprocessing import Pool, Process

import threading

import time

import datetime

 

def multiprocess():

    start = int(time.time())

 

    ojbect_list = []

    for i in range(1,12):

        task = Process(target=work_func, args=(i,))

        ojbect_list.append(task)

        task.start()

 

    for task in ojbect_list:

        task.join()

   

    end = int(time.time())

    print("***run time(sec) : ", end-start)   

   

    print("Number of Core : " + str(mp.cpu_count()))

   

 

def work_func(x):

    print("time : " + str(datetime.datetime.today()) +  " value :" + str(x)  + " PID : "  + str(os.getpid()))

 

if __name__ == '__main__':

# execute only if run as a script

   

    multiprocess()

 

 

코드를 실행한 결과를 살펴보면 실행마다 다른 프로세스(PID 각각 다름)에서 실행된것을 있다.

 

Pool Process 차이점은, Pool 경우 실행되어야 작업이 코어수 만큼 분할되고 코어수 만큼 프로세스가 생성되어 힐당받은 작업을 처리하는데, Process 경우 작업마다 새로운 프로세스가 할당되어 작업을 처리한다.

 

 

2021-03-02/ Sungwook Kang / http://sungwookkang.com

 

파이선파이썬, python, 병렬처리, Multiprocessing, Python Multiprocessing, 파이썬 병렬처리, 데이터 처리, Data Processing

 

Python Multiprocessing(Pool) 사용한 데이터 처리 속도 개선

 

·       Version : MAC OS, Python 3.X, PIP3

 

대용량 데이터를 효율적으로 처리하기 위해서는 병렬 처리를 활용하는것이 좋다. 대부분의 머신러닝/딥러닝에 사용되는 프레임워크들은 함수 내부에서 병렬처리가 가능하도록 설계되어 있기 때문에 시스템의 자원을 효율적으로 사용하지만, 일반적으로 많이 사용되는 데이터 가공 모듈인 pandas 같은 모듈은 병렬처리를 기본적으로 제공하지 않기 떄분에 별도의 병렬처리가 가능하도록 코딩을 해야한다.

 파이썬에서 병렬처리를 제공하는 대표적인 라이브러리는 Threading Multiprocessing 모듈이다. Threading 모들은 파이썬의 GIL(Global Interpreter Lock)라는불리우는 잠금 모델을 사용하기 때문에I/O 작업이 아닌 CPU 작업이 많을 경우 오히려 성능이 저하된다. 방식은 Lock 풀고 스레드를 교환하고 다시 Lock 거는 형태의 멀티스레드이기 떄문이다.

파이썬에서는 Multiprocessing 권장하고 있으며,   모듈에는 대표적으로 Pool Process 있지만 이번 글에서는 Pool 대해서 다루기로 한다.

 

아래 실습코드는 1에서 12까지 숫자를 1 간격으로 출력하는데, for 문을 사용한 싱글처리와 Pool 사용하여 병렬 처리를 하였을때의 처리 시간 할당된 프로세스를 확인한다.

import os

import multiprocessing as mp

from multiprocessing import Pool

import threading

import time

import datetime

 

def non_multiprocess():

    print("non multiprocess")

    start = int(time.time())

   

    for i in range(1,12):

        work_func(i)

 

    end = int(time.time())

 

    print("Number of Core : " + str(mp.cpu_count()))

    print("***run time(sec) : ", end-start)   

 

def multiprocess():

    print("non multiprocess")

 

     #멀티 프로세싱을 위한 CPU 숫자 확인 만들기

    num_cores = mp.cpu_count()

    pool = Pool(num_cores)

 

    start = int(time.time())

 

    ojbect_list = []

    for i in range(1,100):

        ojbect_list.append(i)

    #멀티 프로세싱 워커 호출

    pool.map(work_func, ojbect_list)

 

    end = int(time.time())

 

    #메모리 방지 위해 사용

    pool.close()

    pool.join()

 

    print("Number of Core : " + str(mp.cpu_count()))

    print("***run time(sec) : ", end-start)   

 

def work_func(x):

    print("time : " + str(datetime.datetime.today()) +  "value :" + str(x)  + " PID : "  + str(os.getpid()))

   

    time.sleep(1)

 

if __name__ == '__main__':

# execute only if run as a script

    #non_multiprocess()

    multiprocess()

   

 

 

코드를 실행하면 아래와 같은 결과를 확인할 있다. non multiprocess 라고 되어 있는 결과는 for문을 사용한 싱글 프로세스이며, 개의 프로세스(PID : 49650) 사용되었으며, 순차적으로 실행되어 12초의 시간이 소요된 것을 확인할 있다. Multiprocess 경우 동시에 6개의 프로세스(필자의 테스트 컴퓨터는 6core이다.) 할당되었으며 PID 다른것을 확인할 있다. 전체 실행시간은 2초가 소요된 것을 확인할 있다.

 

간단한 테스트에서는 Multiprocessing 대한 효과를 크게 느끼지 못할수도 있으나 데이터가 기하급수적으로 커질때에는 데이터 처리 속도에 따른 시간이 엄청나게 차이난다.

 

 

2021-03-01/ Sungwook Kang / http://sungwookkang.com

 

파이선파이썬, python, 병렬처리, Multiprocessing, Python Multiprocessing, 파이썬 병렬처리, 데이터 처리, Data Processing

 

파이썬과 OpenCV 이용한 성별 연령 판별하기

 

·       Version : Python 3.X, OpenCV

 

파이썬과 OpenCV 라이브러리를 활용하여 성별 연령을 판별해 보도록 한다. 이번 포스트에서는 프로그램 코드에 대한 설명이나 알고리즘에 대한 설명은 다루지 않는다. 참고 사이트에서 다운로드 받은 소스를 단순히 실행하고 결과를 얻음으로써, 이미지 분석에 대한 흥미를 유발하는데 목적이 있다.

 

CV (Computer Vision) 컴퓨터가 인간처럼 디지털 이미지와 비디오를 보고 식별할 있게 하는 연구분야 이다. Computer Vision 디지털 이미지를 수집, 처리, 분석 이해하여 실제 세계에서 고차원적 데이터를 추출하여 결정에 사용할 있는 기호 또는 숫자 정보를 생성한다. 과정에는 물체 인식, 비디오 추적, 모션 추정 이미지 복원과 같은 사례가 포함된다.

Open CV Open Source Computer Vision 약자이다. 라이브러리는 실시간 이미지 비디오를 처리하는 동시에 분석 기능을 제공한다. 딥러닝 프레임워크인 TensorFlow, Caffe PyTorch 지원한다.

이번 프로젝트에서 사용되는 알고리즘은 CNN (Convolutional Neural Network)으로 이미지 인식 처리 NLP 목적으로 사용되는 DNN(Deep Neural Network)이다. ConvNet이라고도하는 CNN에는 입력 출력 레이어와 여러 개의 숨겨진 레이어가 있으며 다수는 컨볼루션이다. 실습에 사용된 파이썬 프로젝트의 CNN 3개의 컨볼루션 레이어가 있다.

·       Convolutional layer; 96 nodes, kernel size 7

·       Convolutional layer; 256 nodes, kernel size 5

·       Convolutional layer; 384 nodes, kernel size 3

 

각각 512개의 노드가 있는 2개의 완전히 연결된 레이어와 softmax 유형의 최종 출력 레이어가 있다. 이번 프로젝트에서는 아래와 같은 분석 결과를 도출한다.

·       얼굴 감지

·       남성 / 여성으로 분류

·       8 가지 연령대 하나로 분류

·       결과를 이미지에 놓고 표시

 

프로젝트에는 Adience 데이터셋을 사용한다. 데이터셋은 얼굴 사진의 벤치 마크 역할을 하여 노이즈, 조명, 포즈 모양과 같은 다양한 실제 이미징 조건을 포함한다. 이미지는 Flicker 앨범에서 수집되어 CC(Creative Commons) 라이선스에 따라 배포되었다. 8가지 연령대((0 – 2), (4 – 6), (8 – 12), (15 – 20), (25 – 32), (38 – 43), (48 – 53), (60 – 100)) 2,284명의 피사체에 대한 26,580장의 사진이 있으며 크기는 1GB 이다. 프로젝트에서 사용된 모델은 데이터셋을 사용하여 훈련되었다. (그래서인지 동양인에 대한 나이 예측을 하지 못한다.)

 

프로젝트를 실행하기 위해서는 파이썬이 설치되어 있어야 하며, 아래 패키지를 PIP 사용하여 설치 있도록 한다.

pip install opencv-python

 

프로젝트를 다운로드 한다.

·       Download : https://drive.google.com/file/d/1yy_poZSFAPKi0y2e2yj9XDe1N8xXYuKB/view)

 

프로젝트에는 아래와 같은 파일로 이루어져 있다.

·       opencv_face_detector.pbtxt : 얼굴을 감지 하기 위한 파일. 텍스트 형식

·       opencv_face_detector_uint8.pb : 얼굴을 감지 하기 위한 파일. 이진 형식

·       age_deploy.prototxt : 연령에 대한 네트워크 구성 설정

·       age_net.caffemodel : 연령에 대한 레이어 매개 변수의 내부 상태를 정의

·       gender_deploy.prototxt :성별에 대한 네트워크 구성

·       gender_net.caffemodel : 성별에 대한 레이어 매개 변수의 내부 상태를 정의

·       a few pictures to try the project on

 

프로그램을 실행하여 사진속의 인물 성별과 연령이 맞는지 확인해 본다. (필자의 실험에서는 사진에 필터가 적용되어 있거나, 포샵을 과하게 한경우 정확한 인식을 하지 못하였다.)

python gad.py --image woman1.jpg

 

다운로드 받은 프로젝트에 포함되어 있는 woman1.jpg 결과.

 

 

다운로드 받은 프로젝트에 포함되어 있는 girl1.jpg 결과.

 

 

 

필자의 얼굴을 Snow 앱을 사용하여 뽀샤시 필터를 적용한 결과

 

 

[참고자료]

·       Interesting Python Project of Gender and Age Detection with OpenCV : https://data-flair.training/blogs/python-project-gender-age-detection/?fbclid=IwAR1d43CEOg-5dnzxPTxE06uB60leOzBKe30bRZewVvsM88V7v6TmTN9GDYI

·       Adience Benchmark Gender And Age Classification : https://www.kaggle.com/ttungl/adience-benchmark-gender-and-age-classification

 

 

 

2020-03-02/ Sungwook Kang / http://sungwookkang.com

 

 

 

파이썬, Python, 얼굴인식, 파이썬 이미지 처리, 이미지 프로세싱, 연령 분석, 성별 분석, 이미지 분석, Convolutional, OpenCV, Computer Vision, 머신러닝, 딥러닝, Neural Network

+ Recent posts