Link
09-25 21:25
«   2020/09   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
Archives
Today
2,201
Total
1,024,947
관리 메뉴

꿈 많은 사람의 이야기

kubeflow pipeline 사용해보기 - kubeflow pipeline example with iris data 본문

IT Infra(Engineer)

kubeflow pipeline 사용해보기 - kubeflow pipeline example with iris data

이수진의 블로그 이수진의 블로그 2020. 4. 7. 09:32

포스팅 개요

이번 포스팅은 kubeflow 예제(kubeflow example)에 대해서 작성합니다. 지난 포스팅에서 kubeflow 설치하는 방법에 대해서 알아보았는데요. kubeflow 설치 후 kubeflow pipeline을 이용해서 kubeflow 사용하는 방법에 대해 작성합니다.

지난 포스팅은 아래 링크이므로 혹시 kubeflow install 방법에 대해서 알고 싶으시면 참고하시면 되겠습니다.

 

kubeflow 설치하기 - Machine Learning pipeline kubeflow install

포스팅 개요 이번 포스팅은 지난 글인 머신러닝 파이프라인이란?(Machine Learning pipeline) 글에 이어서 머신러닝 파이프라인인 kubeflow를 설치(kubeflow install)하는 방법에 대해서 작성합니다. 지난 글 내용..

lsjsj92.tistory.com

 

또한, 해당 글에서 작성하는 kubeflow pipeline example은 iris data을 사용합니다. iris data는 캐글 등에서 쉽게 받을 수 있으니 참고바랍니다. 본 글에서 사용하는 관련 파일들은 아래 github repo에 올려두었습니다. 참고하셔서 편리하게 이용하시길 바랍니다.

https://github.com/lsjsj92/kubeflow_example

 

lsjsj92/kubeflow_example

kubeflow example. Contribute to lsjsj92/kubeflow_example development by creating an account on GitHub.

github.com

 

글을 작성하며 참고한 참고자료는 아래와 같습니다.


포스팅 본문

이제 kubeflow를 사용하는 방법에 대해서 알아보겠습니다. 위에서도 말씀드렸듯이 이번 kubeflow example은 iris 데이터를 사용하였습니다. 또한, 이번 kubeflow 예제는 매우매우매우매우 간단한 방법을 소개하므로 참고 부탁드립니다.

 

전체 구조

본격적인 글 작성에 앞서서 전체 구조를 먼저 살펴보고 가겠습니다. 전체 구조는 아래 사진과 같습니다.

이번 kubeflow example의 구조를 간단하게 설명하면 아래와 같습니다. 

  • 2개의 디렉토리와 하나의 파일이 있습니다.
    • 디렉토리 : load, machine learning model training : kubeflow의 각 단계에 해당되는 디렉토리입니다.
    • 파일 :  pipeline.py : kubeflow에서 사용할 pipeline을 구축할 코드입니다. 파이썬(Python) 기반으로 되어있습니다.
  • 각 디렉토리에는 아래와 같은 파일이 존재합니다.
    •  Dockerfile : kubeflow는 kubernetes 환경에서 동작합니다. 즉, docker container 환경을 사용합니다. 그에 필요한 docker image를 생성할 수 있도록 dokcer file을 만들어줍니다.
    • ~.py : 각 container 단계에서(kubeflow pipeline 단계) 실행할 코드가 파이썬 코드 기반으로 들어가있습니다. 
    • requirements.txt : 각 kubeflow pipeline 단계에서 Python 코드가 실행될 때 필요한 패키지를 설치할 수 있도록 관련 내용을 넣어주는 파일입니다.

 

kubeflow에서 사용되는 각 파일 설명

이제 전체적인 구조를 살펴보았으니, 각 파일의 세부내용을 살펴보겠습니다. 먼저 첫 번째 디렉토리에 있던 1_data_preprocessing입니다.

 

1. 1_data_load : 여기서는 단순히 data를 load하는 용도

그 중 먼저 파이썬 코드를 먼저 살펴보겠습니다.

파이썬 파일 이름은 여려분 마음대로 정하시면 됩니다. 이 단계에서 저는 단순히 data를 load 하는 용도로 사용했습니다. 

해당 코드는 굉장히 단순합니다. 굉장히 쉬운 예제인 iris data다보니 더욱 그렇습니다. 여기서 보셔야 할 것이 argument를 받는 부분입니다. 저는 1개의 argument를 받게 했는데요. 그 argument는 iris.csv 파일이 있는 경로를 지정할 수 있도록 data_path를 받도록 했습니다. 여기서는 그냥 단순히 iris data를 가져오고 shape를 찍어본 후 / 경로에 iris.csv 이름으로 데이터를 저장하도록 했습니다. (이렇게 저장하는 이유는 추후 pipeline 부분에서 설명합니다.)

이제 해당 파일을 실행할 수 있도록 Dockerfile을 만들어주면 됩니다. Dockerfile 이름은 아래와 같습니다.

만약에 해당 파이썬 환경에서 다른 패키지 설치가 필요하다고 하면 requirements.txt에 내용을 작성해주면 됩니다. 그리고 Dockerfile에 RUN pip install -r requirements.txt를 넣어주면 됩니다. 또한, 해당 Dockerfile에서 FROM 부분을 Python:3으로 했는데요. 이 부분이 이따 training_model 부분과 다르므로 유의해주시면 될 것 같습니다.

 

2. iris data를 활용해서 machine learning model training 하기

다음 코드는 load된 데이터를 활용해서 머신러닝 모델을 만드는 코드를 구현합니다.

위 코드는 여러분들 마음대로 작성하시면 됩니다. 다만, 주의하셔야 할 것이 여기서도 마찬가지로 data argument를 받아야 합니다. 앞에서 load된 데이터를 받아야합니다. 그래서 데이터를 받을 수 있도록 argument 설정을 해주어서 받도록합니다.

또한, 하나 더 주의하셔야 할 것이 앞에서의 load data 부분에서 csv 파일을 저장했는데요. 이 저장된 데이터를 해당 pipeline 단계에서 사용하려면 StringIO로 변환해주어야 합니다. StringIO로 변환하는 것은 Python의 from io import StringIO를 가져와서 변환해주면 됩니다. 위 사진 맨 위에 보시면 관련 코드가 보이실 겁니다.

마찬가지로 여기서도 Dockerfile을 만들어줍니다. 그럼 이제 우리는 2개의 Dockerfile을 만드는 것입니다. 하나는 데이터 load를 위한 container, 하나는 모델 훈련을 위한 container입니다. 이 부분은 모델 훈련을 위한 container가 되겠죠?

보시면 아시겠지만 load_data 부분에서의 Dockerfile과 다른 점이 저 FROM 절입니다. 해당 도커 이미지는 scikit-learn이 미리 설치되어 있는 환경입니다. 따라서 저 환경을 사용해 docker image를 만들 것입니다.

 

kubeflow에서 사용되는 Docker image 생성

이제 kubeflow 환경에서 사용할 Python 코드와 Dockerfile 설정을 끝냈습니다. 이 코드를 실제로 kubeflow 환경에서 사용할 수 있도록(kubernetes를 이용하므로) 이미지를 만들어주고 이미지를 배포해줍니다.

 

Dockerfile이 있는 경로에 들어가서 아래와 같은 명령어를 입력해주면 됩니다. 

  • 예시) docker build -t soojin-iris-preprocessing . 

맨 마지막에 . 이 있는 것을 놓치지마세요! 그러면 docker image가 만들어질 것입니다. 이제 이 docker image를 사용할 수 있도록 docker hub에 배포합니다.

 

docker hub에 image를 배포하기 위해서 tag를 달아주고 push해줍니다.

 

마찬가지로 training 부분도 똑같이 진행해줍니다.

실수로 빨간색 선으로 글자를 가렸네요. docker tag soojin-iris-train:latest lsjsj92/soojin-iris-train:0.5 입니다.

 

그러면 아래와 같이 본인의 docker hub 환경에 이미지가 올라간 것을 확인할 수 있습니다.

 

kubeflow 사용을 위한 pipeline 코드 작성

kubeflow를 사용하는 방법은 다양한 방법이 있습니다.(정확히는 있는 것으로 알고 있습니다.) 저는 그 중 pipeline을 구성하여 사용하는 방법으로 iris data를 load하고 훈련할까 합니다.

kubeflow pipeline을 작성하기 위해서는 kfp 라는 패키지를 활용해야 합니다. 관련 패키지 설치 방법 및 다루는 방법은 제가 개요에 작성한 참고자료를 보시면 됩니다.

일단, 제가 이번에 kubeflow pipeline을 구축하기 위한 pipeline.py 코드는 아래와 같습니다.

여기서 참고하셔야 할 사항은 다음과 같습니다.

  • 파이프라인 이름 구성
  • 파이프라인 함수 생성
  • 각 pipeline에서 사용되는 name과 image(docker container를 만들기 위한 이미지) 그리고 각 container 환경에서 사용되는 arguments 설정
  • ml.after(add_p)와 같은 순서
    • 순서에서 ml 부분은 arguments로 add_p에서 나온 output['iris']를 사용합니다.
    • add_p 부분에서 자세히 보시면 file_outputs{'iris':'/iris.csv'}로 표시했는데요. 해당 부분은 load_data.py에서 저장한 경로를 지정한 것입니다.

kubeflow에서 사용되는 pipeline 단계의 이미지는 아까 저희가 만들었던 docker image를 사용하면 됩니다. 그리고 그 docker image를 만들 때 파이썬 코드 안에 argument를 넣었었는데요. 그 argument를 여기서 다시 설정해주어 argument를 제공해주면서 실행되도록 합니다.

 

이렇게 pipeline.py 파일이 구성되었으면 이제 아래와 같은 명령어로 tar.gz파일로 만들어줍니다.

dsl-compile --py 파이프라인코드이름.py --outout 파이프라인이름.tar.gz

dsl-compile 명령어도 제가 참고 사항에 올려드린 kubeflow 공식 문서에 나와있습니다. 관련해서 설치해주시면 됩니다.

 

위 명령어를 입력하게 되면 아래와 같이 soojin-iris-pipeine.tar.gz 파일이 만들어지게 됩니다!

자! 이제 드디어 kubeflow 예제를 돌리기 위해서 iris kubeflow example 환경이 전부 갖추어졌습니다.

이제 실제로 관련 코드를 동작시키면 끝입니다!

 

kubeflow example 실행시키기 - training machine learning model with iris data

이전 글에서 kubeflow를 잘 설치하셨다면 kubeflow 환경에 접속하시면 됩니다. 그러면 웹 환경을 볼 수 있을탠데요. 왼쪽에 pipelines를 클릭하셔서 들어가신 다음 upload pipeline을 클릭합니다.

 

이제 새로운 pipeline을 kubeflow 환경에서 만들겁니다. 즉, kubeflow pipeline을 만드는 것이죠

여기서 방금전에 만들었던 pipeline.tar.gz 파일을 업로드해주면 됩니다. 아래 사진과 같이 말이죠!

 

자! 여기까지 잘 되셨다면 아래 사진과 같이 kubeflow pipeline graph가 나오는 것을 확인할 수 있으실겁니다. 여기서 create experiment를 눌러서 실험을 해봅니다.

 

실험을 한다는 것은 이 파이프라인을 동작시켜보는 것입니다. 실험을 누르게 되면 experiment name 등을 입력하게 됩니다.

 

필요한 입력사항을 입력하게 되면 밑에 run paramentes 부분에서 start 버튼이 활성화됩니다. start 버튼을 누르게 되면 kubeflow pipeline이 동작되게 됩니다. start를 눌러봅시다.

 

그러면 위와 같이 run name에서 방금 실행시킨 experiment가 나오게 됩니다. status도 확인할 수 있는데요. 해당 부분에 마우스를 클릭하거나 아니면 저 run name 부분을 마우스 클릭하게 되면 상세한 것을 볼 수 있게 됩니다.

저 부분을 눌러서 들어가보겠습니다.

 

클릭해서 들어가게 되면 kubeflow pipeline이 동작되는 순서가 눈에 보이게 됩니다. 저 graph 부분의 박스를 클릭하게 되면 동작되고 있는 log 등을 확인할 수 있습니다. 저는 iris data로 kubeflow pipeline을 구성했기 때문에 굉장히 단순하고 빠르게 pipeline이 동작됩니다.

 

 

그리고 이렇게 잘 동작이 되면 전부 초록색 버튼으로 나오게 되고(실패하면 빨간색) log를 살펴보면 실제로 정확도를 측정한 로그값이 나와있습니다. 여기까지 실행하면 kubeflow example을 동작시켜본 것입니다!


맺음말

본 글은 개요에서도 설명드렸듯이 매우 간단한 kubeflow pipeline 예제(kubeflow pipeline example)을 담고 있습니다. iris data를 활용해서 kubeflow pipeline을 만들었기 때문에 단순할 수 밖에 없겠네요 ㅎㅎ

kubeflow pipeline 예제가 그렇게 많지 않아서 굉장히 삽질을 많이 하면서 진행했네요..

부디 kubeflow를 사용해보시려는 입문자 분들에게 도움이 되길 바랍니다.

다음 포스팅에서는 AWS와 연동하는 방법에 대해서 작성하겠습니다. 

다음 글 : https://lsjsj92.tistory.com/586

 

kubeflow pipeline AWS와 연동하기 - kubeflow pipeline example with titanic data

포스팅 개요 이번 포스팅은 지난 글(kubeflow pipeline iris data)에 이어 kubeflow 예제(kubeflow example)에 대해서 작성합니다. 지난 글은 kubeflow 설치하는 방법과 kubeflow를 간단하게 사용할 수 있는 방법..

lsjsj92.tistory.com

감사합니다.

14 Comments
  • 프로필사진 bell24 2020.04.13 22:45 감사합니다!
  • 프로필사진 bell24 2020.04.13 22:51 혹시 파이프라인 안에서 특정 component의 내용이 변경 된다면, (예를 들어, 모델 학습 부분에서 딥러닝 사용 시 레이어 추가 등) 이미지를 다시 빌드하고 파이프라인을 tar로 다시 말아서 KFP UI에서 tar올리고.. 이렇게 비효율적으로 해야될까요?? 아니면 파이프라인에서 컴포넌트만 바꿀 수도 있나요?? 음.. fairing을 사용하면 해결될까요..?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.04.14 09:50 신고 안녕하세요.
    음 일단 생각이 드는 것은 해당 image에서 내용이 변경되는 것이다보니, 해당 docker image에서 hyperparameter를 변경할 수 있도록 지정해주고, 파이프라인 상에서 값을 넣을 수 있도록 하는 것도 방법입니다.
    예를 들어서 Dense layer를 for문으로 돌려서 5개만 생성할 수 있고, 10개를 생성할 수도 있고 등등을 argument를 넣어서 지정할 수 있도록 하는 것이죠~
  • 프로필사진 bell24 2020.05.09 17:08 답변 감사합니다! 저번에 이해를 잘 못해서 한 번 더 보려고 왔어요! ㅎㅎ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.09 19:21 신고 안녕하세요 ㅎㅎ 감사합니다 부족한 글이라 도움이 크게 되지 못하나보네요 ㅠㅠ
  • 프로필사진 bell24 2020.05.17 15:32 그리고 저의 경우, 1_load_data 단계에서 계속 iris.csv를 읽지 못하는 오류가나서(반면에 로컬에서 도커로 컨테이너 실행 시 잘 되더라구요..) 디버깅하다보니 ENTRYPOINT에서 python을 python3으로 변경했더니 잘 작동하게 됐습니다! 이유는 모르겠지만.. 쿠브플로가 아직 좀 어렵네요! ㅎㅎ
  • 프로필사진 beatz 2020.04.14 17:50 우선 좋은 자료 올려주셔셔 감사합니다~
    Kubeflow쪽 정보를 습득하는데 많은 도움이 되었습니다!
    따라해보려고 pipeline을 Kubeflow UI에 upload한 후 experiments를 수행을 하였는데 job이 정상적으로 수행되지 않고 아래와 같은 오류를 발생시키면서 구동이 실패가 됩니다.
    ---------------------------------------------------------
    File "load_data.py", line 1, in <module>
    import pandas as pd
    ModuleNotFoundError: No module named 'pandas'
    -----------------------------------------------------------
    requirements.txt에 패키지 정보를 기재하고 image를 다시 build하여야하는것인지..
    파이썬쪽은 잘 몰라서 해결방법있을까 싶어 댓글 남깁니다.
    그럼 좋은 하루 보내세요~
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.04.15 12:08 신고 안녕하세요~ 답장이 조금 늦었네요.
    아 제가 작성한 pipeline 코드 그대로 사용하지는 않으셨나보네요.
    말씀하신 것처럼 requirements.txt에 pandas를 추가하셔야 할 것 같아요.
    그리고 나서 다시 build 하신 후 진행하시면 될 것 같습니다 ~
  • 프로필사진 beatz 2020.04.16 14:50 별도의 수정없이 github에서 그대로 내려받아 사용했었습니다~
    말씀해주신대로 data_load쪽 requirements.txt에 패키지들 추가하여 주고 Iris.csv 파일이름을 iris.csv로 변경하여 도커 이미지를 재생성하고 나니 정상적으로 실행이 되었습니다! 도움주셔셔 감사합니다^^
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.04.16 19:25 신고 아 그렇군요 ㅎㅎ 고생하셨습니다 ~ 감사합니다
  • 프로필사진 분석뉴비 2020.04.17 19:07 신고 안녕하세요. 좋은 자료 정말 감사합니다.
    원격에 있는 서버에다가 현재 시도중입니다.
    pipeline까지는 tar까지 잘만들어지고 로컬로 다운로드 해서 파일을 올렸는데,
    Error occured while trying to proxy to: (ip):(port)/apis/v1beta1/pipelines/upload?name=lsr&description=qqqq
    와 같은 에러가 발생합니다.
    혹시 해결 방법을 아실까 싶어서 댓글 남깁니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.04.17 19:28 신고 안녕하세요.
    음 원격에 접속할 때 문제가 발생하는 것 같군요 proxy 문제라는 것 보니까요.
    다양한 원인이 있을 수 있을 것 같아요. 예를 들어 방화벽이 될 수 있겠네요. 포트가 열려 있는지 등등이요! 정확하게는 어떤 환경인지 제가 모르니, 확답을 못드리겠네요 ~
  • 프로필사진 pacs3436 2020.05.25 16:33 처음부터 수진님의 블로그를 따라오지 않아서 다소 방법이 다릅니다
    kubeflow UI상에서 pipeline.tar 구성하여 pipeline 업로드까지 완료하였습니다.

    그리고 experiment에서 해당 파이프라인으로 run시켜서 inferenceService 까지 True로 생성된 모습도 볼 수 있습니다
    하지만 inference service 는 떠있으나 pod는 종료되고 deployment도 0/0상태에서 머뭅니다.

    혹시 비슷한 경험을 하셨던적이 있나요?

    kubernetes는 1.14.1 버전 사용하며
    kubeflow는 1.0.1 버전으로 설치하였습니다
    그리고 클라우드 저장소는 이용하지 않고 로컬호스트에 docker registry를 만들고 pvc 연동하여 serving 및 prediction 까지 테스트보는것이 목표입니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.25 21:56 신고 안녕하세요~
    음.. 저는 아직까지 겪어보지 않은 문제입니다.
    혹시 pod 에러는 어떻게 나오고 있나요?
    kubectl get pods 해보면 pod가 어떤 상태인지 나올 것입니다. 그 에러를 보시고 추가적으로 kubectl describe와 같이 좀 더 자세하게 볼 수 있는 명령어가 있어요. 해당 건을 기반으로 검색을 해보시면 될 것 같아요!
댓글쓰기 폼