Python Multi core processing
전부터 멀티코어 프로세싱에 관심은 있었는데, 막상 천천히 공부해 보지는 않고 생각만 하고 있었다. multiprocessing 과 같은 패키지는 알고 있었지만. 당장 결과에 적용하기가 쉽지 않았다고 해야하나. 코딩 실력도 부족하기도 했고. 어쩌다 검색으로 알게된 최신 멀티코어 프로세싱 패키지 Ray. 대충 봤는데 뭔가 적용하기 쉬울 것 같다. API page를 보면서 차근차근 공부해야겠지만. 일단은 적용가능한 데이터가 어떤게 있을지 부터 막막하니. 한줄이라도 처보자!
alphas = np.linspace(0.0001,0.001)
start = time.time()
# 여러 alpha 값을 넣어주고, alpha일 때 ridge regression 해서 최적 alpha값을 CV로 검증
ridge = RidgeCV(alphas=alphas, normalize=True, cv=5)
ridge.fit(X_train, y_train) print(ridge.alpha_)
# 전체 feature를 넣고 5-fold CV해서 최적 alpha로 도출 된 값
print('duration=',time.time()-start)
# 훈련 set에서 평가 지표
y_pred = ridge.predict(X_train)
mse, _= evalfun(y_train, y_pred) print(f'Train set MSE : {mse:.2f}')
위 코드는 오늘 과제에서 만들었던 Ridge regression 수행 코드, np.linspace의 alpha 값에 대해서 model을 5-fold Cross-validation 으로 돌려가면서 최적(MSE 최소) alpah값을 찾는다.
alphas = np.linspace(0.0001,0.001)
ray.shutdown()
ray.init(num_cpus=4)
@ray.remote
def do_ridgecv(alphas, X_train, y_train):
ridge = RidgeCV(alphas=alphas, normalize=True, cv=5)
ridge.fit(X_train, y_train) # print(ridge.alpha_)
return ridge
start = time.time()
result_ids = [do_ridgecv.remote(alphas, X_train, y_train) for x in range(5)]
results = ray.get(result_ids)
print('duration=',time.time()-start)
RidgeCV model.fit하는 인스턴스 부분을 함수로 만들고, @ray.remote 데코레이터를 붙여준다. 그리고 .remote()로 호출해주면 끝! 물론 예상했던 일이지만, 오히려 실행속도는 느려진다. 전체 train data set X, Y가 필요한 연산인데, 굳이굳이 쪼개서 이리저리 나눠서 다시 붙이는데 시간 손실이 클 수 밖에 없을 것이다. 그보다 중요한 건, 쓰기가 매우 편하다는 사실이다. 당장 패키지를 코드에 적용 하는 것보다. 어떤 형태의 연산에 써야 할지 고민해야 할 것 같다. 종종 시간이 허락할 때, 공식 API문서를 천천히 보고 직접 해보는 연습이 필요할 것.
Uploaded by Notion2Tistory v1.1.0