MACHINE LEARNING Meetup KANSAI #4 2019/3/27
Argo Workflow ʹΑΔMLδϣϒཧShotaro Tanaka / @yubessy / Ϧϒηϯε (ژΦϑΟε)MACHINE LEARNING Meetup KANSAI #4 LT
View Slide
͜Εͷհ͠·͢
https://argoproj.github.io/
Կ͕Ͱ͖Δͷ͔"Container native workflow engine for Kubernetes"• ෳͷίϯςφΛྻ/ฒྻ࣮ߦ͢ΔϫʔΫϑϩʔΛఆٛͰ͖Δ• σʔλύΠϓϥΠϯ, CI/CD ͳͲͷར༻Λఆ• ৽όʔδϣϯͰ DAG αϙʔτ• Argo ϕʔεͷ༷ʑͳϓϩμΫτ• Argo CD: GitOps ʹΑΔ CD Λ࣮ݱ• Argo Event: ϫʔΫϑϩʔͷτϦΨ
apiVersion: argoproj.io/v1alpha1kind: Workflowmetadata:generateName: ml-workflow-spec:entrypoint: maintemplates:- name: mainsteps:- - name: load-datasettemplate: load-dataset- - name: train-model-1template: train-modelarguments:parameters: [{name: model, value: model1}]- name: train-model-2template: train-modelarguments:parameters: [{name: model, value: model2}]...
...- name: load-datasetcontainer:image: postgres:latestcommand: [sh, -c]args: ["psql db -c 'SELECT * FROM dataset' -A -F, > dataset.csv"]- name: train-modelinputs:parameters: [{name: model}]container:image: train-modelcommand: [sh -c]args: ["python train_model.py --model={{inputs.parameters.model}}"]
ͳͥ͏ͷ͔ʮϞσϧ͕Ͱ͖ͨͷͰɺαΫοͱӡ༻ʹ͍ͤͨʯ• MLϞσϧͷ։ൃऀ• SQL Ͱσʔλऔಘ ʙ Ϟσϧ༧ଌΛϑΝΠϧʹग़ྗ• Docker Ͱಈ͘Α͏ʹ͓ͯ͘͠• MLγεςϜͷ։ൃऀ• DBIO Ϟσϧɾ༧ଌ݁ՌͷσϦόϦॲཧΛ࣮• Argo Ͱͯ͢ΛΈ߹ΘͤͨϫʔΫϑϩʔΛ࡞Δ→ ίϯςφ୯ҐͰׂ୲
ϦϒηϯεͰͷར༻ྫ• ग़ྗͷDBॻ͖ࠐΈॲཧͷ• Ϟσϧͷ Continuous Delivery• ฒߦॲཧ
ग़ྗͷDBॻ͖ࠐΈॲཧͷ• ٻਓαΠτͷݕࡧॱҐ੍ޚ༻༧ଌϞσϧ• όονͰֶशɾ༧ଌ͠ग़ྗΛDBʹॻ͖ࠐΈ• Ϟσϧͷ։ൃऀCSVग़ྗ·Ͱ࣮ͯ͠ Docker Խ͓ͯ͘͠• ॻ͖ࠐΈॲཧΫϨσϯγϟϧཧγεςϜͷ։ൃऀ͕࣮steps:- - name: train-model # MLϞσϧͷ։ൃऀ͕࣮- - name: predict-rates # MLϞσϧͷ։ൃऀ͕࣮ (ग़ྗCSV)- - name: import-to-db # MLγεςϜͷ։ൃऀ͕࣮# ※ग़ྗϑΝΠϧڞ༗ϘϦϡʔϜͰड͚͠
Ϟσϧͷ Continuous Delivery• Ӧۀઓུɾࠂग़ߘΛఆͨ͠ٻਓޮՌਪఆϞσϧ• ϚʔέςΟϯά୲ऀ͚ͷϏϡʔϫΛ R-Shiny Ͱ։ൃɾӡ༻• ਪఆॲཧ͕ྃ͢ΔͨͼʹϏϡʔϫΛσϓϩΠͯ͠ϞσϧΛߋ৽steps:- - name: estimate # ਪఆॲཧ- - name: upload-model # ࡞͞ΕͨϞσϧΛετϨʔδʹอଘ- - name: update-viewer # ϏϡʔϫΛσϓϩΠ͢͠
Ϟσϧͷ Continuous Delivery (ଓ͖)• Ϗϡʔϫಉ͡ Kubernetes ΫϥελͰ Deployment ͱ͍ͯಈ͍͍ͯΔ• kubectl set env Ͱ Deployment Λߋ৽͢Δ͜ͱͰ৽͍͠ϞσϧΛಡΈࠐΉ• Rolling Update ʹΑΓμϯλΠϜແ͠ͷϞσϧߋ৽Մೳ- name: update-viewercontainer:image: kubectlcommand: ["sh", "-c"]args: ["kubectl set env deployment/viewer-app MODEL={{workflow.parameters.model}}"]
ฒߦॲཧ• WebςετͷଟόϯσΟοτ࠷దԽͷॏΈߋ৽δϣϒ• ෳͷςετ͕͓ͬͯΓɺ֤ςετͷਪఆॲཧฒߦ࣮ߦ͍ͨ͠steps:- - name: list-experiments # ਪఆॲཧ͕ඞཁͳςετΛϦετΞοϓ- - name: calc-weights # ͜ΕΛϦετΞοϓ͞Εͨςετͷ͚ͩฒߦ࣮ߦ͢Δ# ग़ྗύϥϝʔλͷϦετΛ͢ͱͦͷ͚ͩίϯςφ্ཱ͕͕ͪΔ# Ϧετ [{"experimentId": 1}, {"experimentId": 2}] ͷΑ͏ͳ JSONwithParams: "{{steps.list-experiments.outputs.parameters.experiments}}"# Ϧετͷ֤ΞΠςϜ͔ΒύϥϝʔλΛऔΓग़ͯ͢͠arguments:parameters: [{name: experimentId, value: "{{item.experimentId}}"}]
ฒߦॲཧ (ଓ͖)templates:- name: list-experimentscontainer: ...outputs:parameters:- name: experiments# ग़ྗύϥϝʔλͷϦετΛϑΝΠϧࢦఆvalueFrom: {path: /output/experiments.json}- name: calc-weightscontainer: ...inputs:parameters:# ύϥϝʔλΛೖྗͱͯ͠ड͚औΔ- name: experimentId
·ͱΊ• ෳίϯςφ͔ΒͳΔϫʔΫϑϩʔΛ؆୯ʹΊΔ• ͭͬͨ͘MLϞσϧΛ͘͢ӡ༻͍ͨ͠ͱ͖ʹศརهࣄ͋Γ·͢:Argo ʹΑΔίϯςφωΠςΟϒͳσʔλύΠϓϥΠϯͷϫʔΫϑϩʔཧ