Ray효과적이고 단순하게 분산/병렬 컴퓨팅을 수행할 수 있도록 만든 매우 강력한 프레임워크이다.

 

Ray란

주로 병렬처리를 할 때 multiprocessing으로 웬만한 것은 쉽게 실행이 가능하지만, 아래와 같은 단점이 있다.

  • multiprocessing 라이브러리를 사용하기 위해 기존에 작성한 코드를 수정해야 함(Pool 생성해서 넘기기 등)
  • multiprocessing은 여러 클러스터에서 분산처리하기엔 초심자 입장에서 어려움

이를 대체할 수 있는 것이 바로 Ray이다! 그렇다면 Ray의 장점과 특징은?

  • 1) Apache Arrow를 활용하여 데이터를 효율적으로 처리하고 분산 컴퓨팅을 위한 task를 제공
  • 2) 기존 코드에서 약간의 수정만으로 병렬 처리 가능 : 쉽고 범용적인 사용성
  • 3) 멀티프로세싱보다 빠른 성능
  • 4) Dashboard가 존재해서 성능, 로그 등을 확인 가능
  • 5) 머신러닝/딥러닝에서도 활용하기 Good
  • 6) 로컬 환경, 클라우드의 쿠버네티스, 온프레미스 쿠버네티스 등 다양한 환경에서 사용 가능 (자세한 사항은 Windows Support 참고)

 

한 회사에서 성능과 속도를 실험했을때, Ray가 기본 serial python 보다 10-30배 빠르고, multiprocessing 보다 5-25배 정도 빠르다고 한다. 그리고 serial, multiprocessing을 좋은 머신에서 돌린 것보다 5-15배 빠르다고 한다.

Ray를 코드에 적용하는 방법

1.  설치하기

$ pip3 install ray

2. 적용하기

 1. 라이브러리 추가 (import ray)
     
 2. main 함수에서, ray.init() 추가 (Ray 초기화)
     
 3. 병렬처리 하고자 하는 함수 (또는 클래스) 정의 바로 앞에, @ray.remote 데코레이터 추가

 4. 해당 함수를 호출하려면, obj_id = 함수명.remote() (괄호 안에 인자값 넣을 수 있음)
 * obj_id(=object ID, =future, =최종 출력에 대한 참조 값)를 넣는 이유는, 비동기 처리를 위해서.
     
 5. 해당 함수의 리턴값을 받으려면, ray.get(obj_id)
 * 여러 함수들을 실행시켜 놓고, 먼저 끝난 함수부터 우선 처리하려면 ray.wait(obj_id_list) 활용

 

ray API 설명

  • ray.init()
    • ray를 초기화하고 병렬처리할 프로세스를 할당하고 context를 초기화, dashboard를 띄운다.
  • @ray.remote
    • 파이썬 함수를 Ray Task로 만들어주는 데코레이터
  • ray.remote()
    • remote 함수 호출시 사용하는 접미사로 기존 함수의 인자를 받을 수 있다.
    • 리턴 값은 ObjectRef인데, ray.get(ObjectRef) 하여 task를 실행하고 남은 값을 반환할 수 있다.
    • remote() 작업은 비동기적으로 실행된다.
  • ray.wait()
    • remote()로 지정된 object들 중 준비가 된 object id를 반환하며 task가 완료될 때까지 기다리는 역할을 함.
  • ray.get()
    • ObjectRef(object id)를 인자로 받아 object value를 반환
    • ray.get()은 동기적으로 실행
  • ray.shutdown()
    • ray.init()으로 할당된 프로세스를 종료하고 워커와의 연결을 끊는다.
    • Ray를 사용한 파이썬 프로세스가 종료되면 자동으로 이 코드가 실행됨 (jupyter에서는 직접 호출해야함)

자세한 예시는 https://zzsza.github.io/mlops/2021/01/03/python-ray/ 참고!

( 핸즈온 머신러닝 책 study p.67~)

머신러닝이 어떻게 돌아가는지, 어떤 순서로 데이터를 가공하고 적용할지에 대해서 큰 그림을 그려보긔

 

1. 문제정의 - 어떤 기법을 쓰지? 어떤 데이터지? 


2. 성능 측정 지표 선택 - 대표적: 평균 제곱근 오차(RMSE): 유클리디안 노름(방법), 예측값의 벡터와 타깃값의 벡터 사이의 거리를 재는 방법


3. 데이터 가져오기


4. 환경 구축
  1) 데이터 구조 훑기: head(),info(), value_counts(), describe(), 
  2) 데이터 시각화를 통해 데이터 살펴보기
   : 히스토그램을 통해 알 수 있는 결과: 각 컬럼들의 스케일, 상한 하한값, 특성 어떻게 표시되어있는지, 모양의 분포를    통해 정규화해야할지 말지 정하기
   3) 테스트 세트 만들기
   : 테스트 세트를 떼어놓는 이론적인 방법: 무작위로 어떤 샘플을 선택해서 데이터셋의 20% 정도를 (데이터셋이 매우         크다면 그보다 적게) 떼어놓으면 됨.


4. 데이터 이해를 위한 탐색과 시각화
   : 산점도, 상관관계 조사(corr()), 등등


5. 머신러닝 알고리즘을 위한 데이터 준비
   1) 데이터 정제: dropna(), drop(), fillna(), simpleImputer()(누락된 값을 손쉽게 다루게 해줌, 누락된 값을 특성의 중간          값으로 대체 한다고 지정)
   2) 텍스트와 범주형 특성 다루기- > 텍스트를 숫자로 변환(OrdinalEncoder() 사용), OneHotEncoder()
   3) 특성 스케일링: min-max스케일링(정규화), StandardScaler()(표준화)

 

6. 모델 선택과 훈련
   :과소/과대적합 고려하기
    1) 선형회귀 모델: LinearRegression
    2) 의사결정 모델: DecisionTreeRegressor
    3) RandomForestRegressor
    4) 과대 적합일 경우 대안으로 사용하는 방법: 교차검증(k fold cross_val_score)


7. 모델 세부 튜닝

   1) 그리드 탐색(GridSearchCV)

       : 만족할 만한 하이퍼파라미터 조합을 찾아줌

   2) 랜덤 탐색(RandomizedSearchCV)

      : 그리드 서치와 비슷하지만 하이퍼파라미터 탐색공간이 커지면 사용하는 편이 좋음

   3) 앙상블 방법

      : 최상의 모델을 연결해보는 것, 모델의 그룹을 단일 그룹보다 더 나은 성능을 발휘할 때가 많음, 

   4) 최상의 모델과 오차분석

      : 정확한 예측을 위한 특성의 상대적인 중요도를 알려줌

   5) 테스트 세트로 시스템 평가하기

머신러닝이란?

데이터에 모델을 맞추는 것!(fitting) 모델은 데이터의 특징과 성향에 따라 기법을 적용시켜 최적화시킨다.

어떤 조건에 대해 예측을 할때, 다음과 같은 방법으로 할 수 있다. 

 

지도 학습과 비지도 학습

- 학습하는 동안의 감독 형태나 정보량에 따라 분류

 

지도학습

1. 레이블이 있다.

2. 분류(classification)

3. 회귀(regression): 예측 변수라는 특성(feature)을 사용해 타깃 수치를 예측하는 것

4. 지도학습 알고리즘: K-최근접 이웃(k-nearest neighbors), 선형회귀(Linear Regression), 로지스틱 회귀(Logistic regression), 서포트 벡터 머신(Support Vector Machine), 결정트리와 랜덤 포레스트(Decision tree, Random Forest), 신경망(neural networks)

 

비지도 학습

1. 레이블이 없다. 

2. 비지도 학습 알고리즘:

군집(clustering) - k-평균(k-means) DBSCAN, 계층 군집분석(hierarchical cluster analysis)(HCA), 이상치 탐지와 특이치 탐지(outlier detection, novelty detection), 원-클래스(one-class SVM), 아이솔레이션 포레스트(isolation forest)

시각화와 차원축소(visualization, dimensionality reduction) - 주성분 분석(principal component analysis)(PCA), 커널PCA(kernel), 지역적 선형 임베딩(locally-linear embedding)(LLE), t-SNE(t-distributed stochastic neighbor embedding)

연관 규칙 학습(association rule learning) - 어프라이어리(Apriori), 이클렛(Eclat)


준지도 학습

1. 일부만 레이블이 있는 데이터

2. 지도 학습과 비지도 학습의 조합으로 이루어져 있다.

3. ex)구글 포토 호스팅 서비스

 

강화 학습

1. 에이전트: 학습하는 시스템

2. 환경을 관찰해서 행동을 실행하고 그 결과로 보상을 받는 것. 최상의 보상을 받기 위해 스스로 학습, 에이전트가 상황별로 어떻게 행동해야할지 결정.


배치 학습과 온라인 학습

- 입력 데이터의 스트림으로부터 점진적으로 학습할 수 있는지에 대한 여부에 따라 분류

 

배치 학습 

1. 시스템이 점진적으로 학습할 수 없음. 가용한 데이터를 모두 사용해 훈련

2. 오프라인 학습이라고도 함.

3. 시스템을 훈련시키고 제품 시스템에 적용하면 더 이상의 학습 없이 실행됨.

4. 이 시스템이 새로운 데이터에 학습하려면 시간과 비용 많이 소요, 새롭게 다시 훈련시켜야함.

 

온라인 학습

1. 데이터를 순차적으로 한개씩이나 미니배치라 부르는 작은 묶음 단위로 주입하여 시스템 훈련

2. 학습단계가 빠르고 비용이 적게듦 

3. 학습해야하는 데이터가 방대할 때, 그리고 학습에 사용되는 데이터가 꾸준히 입력될때 사용


사례 기반 학습과 모델 기반 학습

- 어떻게 일반화(generalize)되는가에 따라 분류. 일반화란 주어진 훈련 데이터로 학습하고 훈련 데이터는 본 적 없는 새로운 데이터에서 좋은 예측을 만들어야한다는 뜻

 

사례 기반 학습

1. 시스템이 훈련 샘플을 기억함으로써 학습

2. 비슷한 것 끼리 유사도 측정해 새로운 데이터와 학습한 데이터 샘플을 비교하는 식으로 일반화함

 

모델 기반 학습

1. 샘플들의 모델을 만들어 예측에 사용하며 일반화 시키기


 

머신러닝 프로젝트 형태를 요약하자면,

 

1. 데이터를 분석한다. 

2. 모델을 선택한다.

3. 훈련 데이터로 모델을 훈련시킨다. (비용함수 최소화하는 파라미터 찾기)

4. 테스트 데이터나 새로운 데이터에 모델을 적용해 예측한다. 

 

 

여기서, 머신러닝 데이터를 테스트셋과 트레이닝 셋으로 나누는 이유

training dataset은 학습시킬 파라미터들을 결정하는데 사용, 학습할 데이터

test dataset은 실제 학습된 모델을 평가하는데 사용되는 데이터. 이 데이터를 통해 머신러닝 알고리즘이 얼마나 잘 학습되었는지 평가함.

 

 

 

교차 검증이란?

  • 보통은 train set 으로 모델을 훈련, test set으로 모델을 검증한다.
  • 여기에는 한 가지 약점이 존재한다.
  • 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결국 내가 만든 모델은 test set 에만 잘 동작하는 모델이 된다.
  • 즉, test set에 과적합(overfitting)하게 되므로, 다른 실제 데이터를 가져와 예측을 수행하면 엉망인 결과가 나와버리게 된다.
  • 이를 해결하고자 하는 것이 바로 교차 검증(cross validation)이다.
  • 교차 검증은 train set을 train set + validation set으로 분리한 뒤, validation set을 사용해 검증하는 방식이다.

 

교차 검증의 장점과 단점

  • 장점
    • 모든 데이터셋을 훈련에 활용할 수 있다.
      • 정확도를 향상시킬 수 있다.
      • 데이터 부족으로 인한 underfitting을 방지할 수 있다.
    • 모든 데이터셋을 평가에 활용할 수 있다.
      • 평가에 사용되는 데이터 편중을 막을 수 있다.
      • 평가 결과에 따라 좀 더 일반화된 모델을 만들 수 있다.
  • 단점
    • Iteration 횟수가 많기 때문에, 모델 훈련/평가 시간이 오래 걸린다.

 

교차 검증 기법 종류

  • K-Fold Cross Validation ( k-겹 교차 검증 )
  • Stratified K-Fold Cross Validation ( 계층별 k-겹 교차 검증 ) 등

1. K-Fold Cross Validation ( k-겹 교차 검증 )

  • K-Fold는 가장 일반적으로 사용되는 교차 검증 방법이다.
  • 보통 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가진 경우에 사용된다.
  • 자세한 K-Fold 교차 검증 과정은 다음과 같다.
    1. 전체 데이터셋을 Training Set과 Test Set으로 나눈다.
    2. Training Set를 Traing Set + Validation Set으로 사용하기 위해 k개의 폴드로 나눈다.
    3. 첫 번째 폴드를 Validation Set으로 사용하고 나머지 폴드들을 Training Set으로 사용한다.
    4. 모델을 Training한 뒤, 첫 번 째 Validation Set으로 평가한다.
    5. 차례대로 다음 폴드를 Validation Set으로 사용하며 3번을 반복한다.
    6. 총 k 개의 성능 결과가 나오며, 이 k개의 평균을 해당 학습 모델의 성능이라고 한다.
  • 예제 코드
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.3) # test_size=0.3: train- 7대 test- 3으로 비율 나눠줌

model = LinearRegression()
model.fit(X_train, y_train)

print("학습 데이터 점수: {}".format(model.score(X_train, y_train)))
print("평가 데이터 점수: {}".format(model.score(X_test, y_test)))​
from sklearn.model_selection import cross_val_score, cross_validate
import numpy as np

scores = cross_val_score(model, diabetes.data, diabetes.target, cv=5)

print("교차 검증 정확도: {}".format(scores))
print("교차 검증 정확도: {} +/- {}".format(np.mean(scores), np.std(scores)))

 

KFold 상세 조정하기

  • 위 cross_val_score 함수에서는, cv로 폴드의 수를 조정할 수 있었다.
  • 만약 검증함수의 매개변수를 디테일하게 제어하고 싶다면
  • 따로 검증함수 객체를 만들고 매개변수를 조정한 다음, 해당 객체를 cross_val_score의 cv 매개변수에 넣을 수도 있다.
  • 이를 '교차 검증 분할기' 라고도 한다.
from sklearn.datasets import load_iris 
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_score 

iris_data = load_iris() 

# 모델 
logreg = LogisticRegression() 

# n_split : 몇개로 분할할지 
# shuffle : Fold를 나누기 전에 무작위로 섞을지 
# random_state : 나눈 Fold를 그대로 사용할지 

kfold = KFold(n_splits=6, shuffle = True, random_state=0) 

# 파라미터는 (모델, Traingdata의 feature, Trainingdata의 target, 폴드수) 이다. 
scores = cross_val_score(logreg , iris.data , iris.target ,cv=kfold) 

# Trainingdata에 대한 성능을 나타낸다. 
print('교차 검증별 정확도:',np.round(scores, 4)) 
print('평균 검증 정확도:', np.round(np.mean(scores), 4))

 

 

 

딥러닝을 이해하기 위해서는 다층 퍼셉트론의 의미를 정확하게 파악하고 있어야한다. 따라서 이번 시간에는 다층 퍼셉트론(MLP)과 이를 실행하기 위해 사용되는 활성화 함수에 대해서 알아볼 것이다. 

 

그 전에 아주 간단하게 단층 퍼셉트론에 대해 설명하고 넘어가겠다. 

단층 퍼셉트론은 활성함수(a) 가 단 하나밖에 없는 구조이다. 단층 퍼셉트론은 선형분류기로 비선형적으로 분리되는 데이터에 대해서는 제대로 된 학습이 불가능하다는 단점이 있다. 예를 들면, AND나 OR연산의 문제는 해결할 수 있지만 XOR연산에 대해서는 학습이 불가능하다는 것이다. 

 

비선형적인 XOR문제는 해결하지 못하는 단층 퍼셉트론

위를 해결하기 위해서 나온 개념은 hidden layer(은닉층)이다. hidden layer을 사용하여 비선형적인 데이터도 학습이 가능하도록 고안된 방법이 다층 퍼셉트론이다. 

다층 퍼셉트론은 입력층과 출력층 사이에 숨어있는 층이라 해서 의미로 은닉층(hidden layer)이 존재한다. 

만약에 3개 이상의 은닉층이 존재하는 인공신경망이라면 이를 심층신경망(deep neural network, DNN)라고 하며,

심층 신경망을 학습하기 위해 고안된 특별한 알고리즘들을 딥러닝(deep learning)이라고 부른다.

좀 더 적은 파라미터 뉴런과 노드를 가지고도 복잡한 패턴을 표현할 수 있기 때문

 

활성화 함수, softmax, 역전파 알고리즘 설명은 

https://aristudy.tistory.com/34

'Data Scientist > Deep Learning' 카테고리의 다른 글

[ML] SDD(Single Shot Detector)  (0) 2022.05.12
[ML] One Stage와 Two Stage  (0) 2022.05.12
[ML] Mask R-CNN (Instance segmentation)  (0) 2022.05.11
[딥러닝] 활성화 함수, 역전파 알고리즘  (0) 2022.02.03
[딥러닝] ResNet  (0) 2021.06.11

안녕하세요, 이번 시간에는 간단한 python flask 코드를 docker image로 실행시켜보는 시간을 가져볼거에요.

 

도커(Docker)는 컨테이너 기반 오픈소스 가상화 플랫폼입니다. 그렇다면 Docker image란 무엇일까요?

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker image라고 합니다. 다시 말해, 컨테이너 실행(생성)에 필요한 모든 파일과 환경을 지닌 것입니다. 예를 들어서 어떤 프로젝트 도커 이미지는 그 프로젝트를 실행하기 위한 모든 파일을 가지고 있는 덩어리라고 생각하면 됩니다.

추가로 Docker image를 만들고 나면 실행을 해야하는데, 이 이미지를 실행한 상태를 도커 컨테이너(Docker Container)라고 합니다. 즉, 프로그램 및 프로그램 실행 환경을 담고 있는 패키지 이미지입니다. 여러 도커 이미지들이 모여 컨테이너가 되기도 하고 필요없으면 이미지를 버리기도 하면서 원하는 실행환경을 만드시면 됩니다. 

 

 

 

이제 개념을 알았다면 한번 만들어볼까요!

※ 개발환경은 ubuntu와 github을 사용했습니다. 

 

python flask를 docker image로 실행시키기

1.디렉토리 생성 및 파일 생성

$ mkdir docker_image_making 
$ cd docker_image_making​

2. 디렉토리 내에 requirements.txt 파일 생성

$ echo "Flask==0.12.2" > requirements.txt 
$ touch hello.py 
$ vi requirements.txt

3. requirements.txt에 들어갈 내용

Flask==0.12.2 
bs4 
requests

4. Dockerfile 생성

$ vi Dockerfile

- 위 내용을 입력한 후, ESC 버튼을 누르고 :wq 를 입력하여 파일을 저장한다. 

FROM python 
COPY . /app 
WORKDIR /app 
RUN pip install flask 
EXPOSE 5000 
CMD ["python", "hello.py"]

5. python flask hello.py 파일 생성

- 에러가 난다면 $ pip3 install flask 또는 $ pip install flask를 본인의 python 버전에 맞게 실행시켜 라이브러리를 다운받는다.
- 그래도 에러가 난다면 $ pip uninstall beautifulsoap 또는 $ pip uninstall beautifulsoap4를 해보자!

from flask import Flask 
app = Flask(__name__) 

@app.route("/") 
def hello(): 
	return "Hello World!" 
    
if __name__=='__main__': 
	app.run(debug=True,host='0.0.0.0')

6. 파이썬 파일이 잘 실행되는지 확인하기

$ python3 hello.py

 

 

 

도커 이미지 만들기
  • 이제 파일들을 다 생성했다면 도커 이미지를 만들 차례이다.
$ docker build --tag [이미지명] 

    ex) $ docker build --tag image-test

  • 잘 만들어 졌는지 확인하기
$ docker image ls

  • 실행시키기
$ docker run -d -p [포트넘버] image-test
  • 현재 실행되고 있는 파일 확인하기
$ docker ps

포트포워딩 및 실행 된 화면
  • 지도학습 
  • 분류를 위한 기준선(결정경계- Decision Boundary)을 정의하는 모델
  • 결정경계는 데이터군에서 최대한 멀리 떨어지는 게 좋음. 
  • 매우 빠르다.
  • SVM은 허용가능한 오류 범위 내에서 가능한 최대 마진을 만들려고 함.

위 그림을 보면 실선은 결정경계, 마진은 그 실선으로부터 두 점선이다. 최적의 결정경계는 마진을 최대화하는 것이다. 마진을 최대화하는 과정에서 이상치(outlier)를 잘 다루는 것이 중요하다. 그러기 위해서는 마진의 기준을 잘 세워야한다.

 

  • 마진(margin): 결정경계와 서포트 벡터 사이의 거리
    • 하드 마진: 기준이 까다롭고 마진이 너무 작다. 다 놓치지 않겠어! -> 오버피팅 발생가능
    • 소프트 마진: 마진이 크고 너그럽다. 대충대충 -> 언더피팅 발생 가능

 

 

간단한 코딩 예제)

 

1. 함수 및 모델 라이브러리 불러오기

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

2. 파이썬에 내재되어 있는 iris 데이터 불러오기

iris=datasets.load_iris()
X=iris.data[:,:2]
y=iris.target

C=1
clf=svm.SVC(kernel='linear',C=C)
clf.fit(X,y)

    - 여기서 파라미터 C는 SVM모델이 오류를 어느정도 허용할 것인지 알 수 있다. 기본 값은 1이고, C값이 클수록 하드마진, 작을수록 소프트마진이다. 이건 데이터에 따라 여러 C값을 넣어보면서 모델을 검증해야한다. 

    - kernel은 'linear' 즉 선형으로 결정경계 선을 긋는 것으로 선택했다. 

    - 아래는 데이터가 어떻게 생겼는지 대략적으로 보기 위해 넣었습니다. - 붓꽃데이터는 3가지의 품종으로 클래스를 분류하는 문제임

'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10')  # 붓꽃 종
'feature_names': ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
'data': array([[5.1, 3.5, 1.4, 0.2],
        [4.9, 3. , 1.4, 0.2],
        [4.7, 3.2, 1.3, 0.2],
        [4.6, 3.1, 1.5, 0.2],
        [5. , 3.6, 1.4, 0.2],
        ....])

3. 오차행렬 만들기

from sklearn.metrics import confusion_matrix
y_pred=clf.predict(X)
confusion_matrix(y,y_pred)  

    - confusion metrix(오차행렬): training을 통한 prediction 성능을 측정하기 위해 예측 value와 실제 value를 비교하기 위한 표

 

4. 시각화 하기

 

datascienceschool.net/03%20machine%20learning/13.03%20%EC%BB%A4%EB%84%90%20%EC%84%9C%ED%8F%AC%ED%8A%B8%20%EB%B2%A1%ED%84%B0%20%EB%A8%B8%EC%8B%A0.html#rbf

 

커널 서포트 벡터 머신 — 데이터 사이언스 스쿨

커널 사용의 장점 커널을 사용하면 베이시스 함수를 하나씩 정의하는 수고를 덜 수 있을뿐더러 변환과 내적에 들어가는 계산량이 줄어든다. 예를 들어, 다음과 같은 기저함수의 경우 \[ \phi(x_i) =

datascienceschool.net

 

+ Recent posts