MACHINE LEARNING Meetup KANSAI #5 2019/6/17
ࣄۀԣஅ৫ͰͷMLγεςϜ։ൃɾӡ༻ͱج൫ઃܭShotaro Tanaka / @yubessy / Ϧϒηϯε (ژΦϑΟε)MACHINE LEARNING Meetup KANSAI #5
View Slide
͢͜ͱ• ෳͷWebαʔϏεΛӡӦ͍ͯ͠Δاۀ• MLγεςϜͷ։ൃɾӡ༻νʔϜԣஅ৫ͱͯ͠αʔϏε͔Βಠཱ• ֤αʔϏεʹϨίϝϯυޮՌ༧ଌϞσϧͳͲෳͷMLγεςϜΛఏڙͱ͍͏ڥͰɺMLγεςϜΛ։ൃɾӡ༻͢ΔͨΊʹͲΜͳΛ͍ͯ͠Δ͔͋Δ͍ɺͦͷͨΊͷMLج൫ΛͲ͏ઃܭ͍ͯ͠Δ͔
αʔϏεɾ৫ɾνʔϜ
৫ߏ• ࣄۀ෦• ΞϧόΠτࣄۀ෦ (ϚοϋόΠτ)• ΩϟϦΞࣄۀ෦ (స৬ձٞ, స৬υϥϑτ, ...)• ෆಈ࢈Ϣχοτ (Door ି, IESHIL)• ...• ԣஅ৫• ςΫϊϩδΧϧϚʔέςΟϯά෦• σʔλϓϥοτϑΥʔϜάϧʔϓ ← MLؔ࿈ͷνʔϜ͜͜ʹॴଐ• σʔλϚʔέςΟϯάάϧʔϓ• ΠϯϑϥετϥΫνϟάϧʔϓ
MLνʔϜɾMLج൫νʔϜࣾһ• MLΤϯδχΞ: 2໊• MLج൫ΤϯδχΞ: 2໊• શʹۀ͍ͯ͠ΔΘ͚Ͱͳ͘ɺॏͳΔ෦͋ΔֶੜΞϧόΠτ• ژΦϑΟε: 4໊• ౦ژΦϑΟε: 1໊• ML/Web/ΠϯϑϥͳͲͷεΩϧΛ׆͔ͯ͠։ൃΛิॿ
ओͳMLγεςϜ
ٻਓϨίϝϯυΤϯδϯ• ϚοϋόΠτɾస৬φϏͳͲͷϢʔβʹٻਓΛਪન• ϝʔϧɾWebαΠτɾωΠςΟϒΞϓϦͳͲ༷ʑͳॴͰಋೖ
ٻਓϨίϝϯυΤϯδϯͷ෦• ධՁɾίϯςϯπΛͱʹ MF, FM ͳͲͷΞϧΰϦζϜΛద༻͠είΞΛࢉग़• user-item item-item ͷϦετΛόονॲཧͰੜ֤͠αʔϏεʹఏڙ
Ԡืɾ࠾༻ͷޮՌਪఆɾ༧ଌϞσϧ• ϚοϋόΠτɾస৬φϏͳͲͷٻਓͷCVRԠื୯ՁΛࢉग़• ݕࡧ݁ՌͷॱҐ੍ޚࠂग़ߘͷ࠷దԽʹ׆༻
Ԡืɾ࠾༻ͷޮՌਪఆɾ༧ଌϞσϧͷ෦• ϩάΛ༻͍ͯϕΠζਪఆɾϩδεςΟοΫճؼͰ༧ଌɾਪఆ• σΟϨΫλʔ͚ʹ؆қతͳϏϡʔϫΛWebΞϓϦͱͯ͠։ൃ
A/BςετɾόϯσΟοτπʔϧ• A/Bςετͷύλʔϯ৴ൺΛόϯσΟοτΞϧΰϦζϜͰࣗಈௐ• WebαΠτɾωΠςΟϒΞϓϦͷ࠷దԽΛޮԽ
A/BςετɾόϯσΟοτπʔϧͷ෦• ཧը໘͔ΒύλʔϯΛొ͠ɺWeb APIͰϥϯμϜʹ৴• CVϩάΛੳج൫Ͱूܭ͠ɺύλʔϯ৴ൺΛࣗಈߋ৽
MLج൫͕ͳ͔ͬͨ࣌
࠷ॳظͷߏ• 2014ࠒʹ࠷ॳͷγεςϜ (ϨίϝϯυΤϯδϯ) Λ։ൃ• σʔλऔಘ͔Βσʔλอଘ·ͰΛҰؾ௨؏Ͱߦ͏δϣϒ
ෳࡶԽ͢Δ࣮• ධՁσʔλͷΈΛ͏ΞϧΰϦζϜΛՃ• ϑΟϧλϦϯάϦετͷϚʔδΛߦͬͯϨίϝϯυϦετΛੜ
ࣅͨΑ͏ͳγεςϜͷ૿Ճ• ಉαʔϏεͰA/BςετͷͨΊϨϙδτϦΛෳͯ͠ΞϧΰϦζϜ͚ͩมߋ• ผαʔϏεͷԣల։ͷࡍʹΞϧΰϦζϜΛίϐʔͯ͠ར༻
ଟछଟ༷ͳ࣮ߦڥ• ֤γεςϜ͕αʔϏεͷڥʹ૬Γ͠ɺσϓϩΠϑϩʔҧ͏• ΦϯϓϨͷϦιʔεʹݶΓ͕͋ΓɺVM͝ͱʹεϖοΫ͕ඍົʹҧ͏
खʹෛ͑ͳ͘ͳ͖ͬͯͨ
͜ͷ··Ͱ͍ͣΕ։ൃӡ༻ഁ͢Δ→ ͦ͏ͳΔલʹMLج൫Λߏங͢Δ͜ͱʹMLج൫ Livesense Brain※ͱΓ͋͑ͣ࠷ॳʹ໊લ͚ܾͩΊͨ
MLج൫ԽͷͶΒ͍։ൃ໘ͷݟ͠• γεςϜͷϞδϡʔϧؒͷີ݁߹Λͳ͘͢• γεςϜؒͰڞ௨ԽͰ͖Δ෦ڞ௨Խӡ༻໘ͷݟ͠• νʔϜ͕ࣗલӡ༻Ͱ͖ΔΠϯϑϥू• δϣϒཧσϓϩΠϑϩʔΛڞ௨Խ
։ൃ໘ͷݟ͠
։ൃ্ͷMLͷίΞ෦ͱͦΕҎ֎͕ີ݁߹• MLΤϯδχΞɾMLج൫ΤϯδχΞͷ୲Λ͠ʹ͍͘• ༻్ʹԠͯ͡ݴޠϥΠϒϥϦΛ͍͚ΒΕͳ͍֤γεςϜͷڞ௨ॲཧΛίϐϖར༻• ڠௐϑΟϧλϦϯάͳͲͷΞϧΰϦζϜ࣮• લॲཧDBೖग़ྗ༻ͷΫϥε→ γεςϜΛػೳ͝ͱʹׂ͠࠶ߏͰ͖ͳ͍͔ʁ
ίϯϙʔωϯτͷׂ֤εςοϓΛ୯ػೳίϯϙʔωϯτʹΓग़͠• ֤ίϯϙʔωϯτ CLI Ͱ୯ಠ࣮ߦͰ͖Δ• ίϯϙʔωϯτؒͷೖग़ྗͯ͢ϑΝΠϧΛհ͢Δྫ:• I/Oίϯϙʔωϯτ: SQLϑΝΠϧΛೖྗ → σʔλΛCSVͱͯ͠ग़ྗ• લॲཧίϯϙʔωϯτ: ςΩετσʔλΛೖྗ → BoWϕΫτϧΛग़ྗ• Ϩίϝϯυίϯϙʔωϯτ: ධՁσʔλΛೖྗ → ਪનείΞΛग़ྗ
ίϯϙʔωϯτͷίϯςφԽ• ֤ίϯϙʔωϯτΛ୯Ұͷ Docker Πϝʔδʹ͢Δ• γεςϜ͝ͱͷࠩ΄΅ઃఆϑΝΠϧɾSQL͚ͩͰදݱ• ୯७ͳόονॲཧͳΒ docker run ͷஞ࣮࣍ߦ͚ͩͰॻ͚Δ• ࣮ࡍʹ͜ΕͰຊ൪Քಇ͍ͯ͠ΔγεςϜ͋Δ# load datasetdocker run -v $(pwd):/workdir sqlkit select ratings.sql /workdir/ratings.csvdocker run -v $(pwd):/workdir sqlkit select content.sql /workdir/content.csv# preprocessdocker run -v $(pwd):/workdir nlpkit vectorize /workdir/content.csv /workdir/features.csv# run recommenderdocker run -v $(pwd):/workdir recommender predict config.yaml /workdir
Pros• ΞϧΰϦζϜ࣮ͳͲΛෳγεςϜؒͰ࠶ར༻Ͱ͖Δ• ίϯϙʔωϯτ͝ͱʹݸผʹ։ൃɾվળ͕Ͱ͖Δ• ผͷݴޠϥΠϒϥϦΛ͏͜ͱ༰қ• ৽نϝϯόʔΞϧόΠτͷࢀೖোน͕͘ͳͬͨ• ͋Δίϯϙʔωϯτʹ͍ͭͯΩϟονΞοϓ͢Εࣄ͕Ͱ͖ΔCons• MLΤϯδχΞؚΊશһʹίϯςφͷ͕ࣝ͋Δఔඞཁ
ӡ༻໘ͷݟ͠
ӡ༻্ͷΠϯϑϥͷมߋͷࣗ༝͕͍• MLγεςϜ͕֤αʔϏεͷΠϯϑϥʹ૬Γ• धཁʹԠͨ͡Ϧιʔεมߋ͕ॊೈʹͰ͖ͳ͍ͦΕͧΕͷγεςϜͷڥ͕શ͘ผ• 10Ҏ্ͷδϣϒ͕֤γεςϜઐ༻ͷVMͰ cron ࣮ߦ• δϣϒཧπʔϧσϓϩΠϑϩʔόϥόϥ→ νʔϜࣗલͷΠϯϑϥͰγεςϜΛҰݩཧͰ͖ͳ͍͔ʁ
Google Kubernetes Engine (GKE) ͷ࠾༻νʔϜࣗલͷίϯϐϡʔςΟϯάج൫ΛखʹೖΕΔ• ߴෛՙͳMLॲཧͷ࣮ߦதΦʔτεέʔϧͰϦιʔεΛ૿ڧ• γεςϜͷߏΛ༰қʹՃɾมߋͰ͖Δ• ྫ: ༧ଌϞσϧͷ؆қϏϡʔϫΛ Deployment ͱཱͯͯ͠ΔෳγεςϜΛ౷Ұ͞ΕͨڥͰҰݩཧͰ͖Δ• WebΞϓϦόονॲཧ୯ҰΫϥελʹಉډ• δϣϒཧσϓϩΠ k8s ͷΤίγεςϜ্Ͱ࣮ݱ
ิ: গਓνʔϜͰ Kubernetes ?γεςϜͷܗଶ͕Ұ༷ɾ୯७ͳΒଞʹྑ͍બࢶ͕͋Δ• όονॲཧ͚ͩ → GCE, Fargate, ...• WebΞϓϦ͚ͩ → GAE, Beanstalk, ...͔͠͠ɺࠓճ༷ʑͳγεςϜΛѻ͏ඞཁ͕͋ͬͨ• ҠߦରͷطଘγεςϜʹόονॲཧWebΞϓϦؚ·ΕΔ• ίϯςφԽ͞ΕͨෳͷίϯϙʔωϯτΛ࿈ܞ͍ͤͨ͞→ ͜ΕΒΛ౷Ұతʹཧ͢Δͷʹ Kubernetes ͕ద͍ͯͨ͠
ϫʔΫϑϩʔΤϯδϯͷಋೖ• δϣϒཧͦͷͷ k8s ͰҰݩԽͰ͖ͨ• ίϯϙʔωϯτΛ࿈ܞͤͯ͞ϫʔΫϑϩʔԽ͍ͨ͠→ Argo Workflow Λಋೖ• k8s ͰίϯςφΛྻɾฒྻɾDAG࣮ߦ͢ΔϫʔΫϑϩʔΤϯδϯ• ϦτϥΠɾΤϥʔॲཧͳͲ؆୯ʹ࣮ݱ• ϫʔΫϑϩʔ࣮ߦΛ Web UI ͰϞχλϦϯάͰ͖ΔલճLTͰհ: Argo Workflow ʹΑΔMLδϣϒཧ - Speaker Deck
σϓϩΠϑϩʔͷࣗಈԽ• σϓϩΠͦͷͷ k8s manifest Λ apply ͢Δ͚ͩ• ߋʹखؒΛলͨ͘ΊσϓϩΠΛࣗಈԽ͍ͨ͠→ Cloud Build Ͱ GitOps Λ࣮ݱ• Manifest ϨϙδτϦͷϓϧϦΫϚʔδΛτϦΨʔͱ͢Δ• Cloud Build Ͱ kustomize build ~ kubectl apply※ Argo CD ݕ౼͕ͨ͠ɺࠓͷنͳΒ Cloud Build Ͱेͱஅ
Pros• νʔϜͰͷӡ༻ͷॊೈੑɾࣗ༝্͕• ඞཁʹԠͯ͡ϦιʔεΛ૿ڧ• PoC ࣮ΛαʔϏεӨڹΛݶఆͯ͠ࢼݧӡ༻• γεςϜ͕૿͑ͯཧίετΛ͍͑͢Cons• ಉ͡ΠϯϑϥʹෳγεςϜ͕ಉډ → ΧεέʔυোͷϦεΫ• δϣϒͷႈੑͳͲ k8s ಛ༗ͷੑ࣭ʹཹҙ͢Δඞཁ
MLج൫લޙͷશମൺֱ
Before
After
Before• ਨߏ = ݽཱͨ͠γεςϜΛݸผʹ։ൃɾӡ༻• γεςϜͷʹൺྫͯ͠ɾਓ͕ඞཁʹͳΓ͕ͪAfter• ਫฏߏ = ػೳίϯϙʔωϯτΛ࠶ར༻͠ɺΠϯϑϥϨΠϠΛڞ௨Խ• γεςϜͷ͕૿͑ͯཧׂ୲͕͍͢͠
·ͱΊ
·ͱΊ• গਓͷԣஅνʔϜͰෳͷMLγεςϜΛ։ൃɾӡ༻• MLج൫Ҏલ֤γεςϜ͕ݽཱͨ͠ঢ়ଶͰଟ͘ͷΛ๊͍͑ͯͨ• MLج൫ߏஙΛ௨ͯ͡։ൃɾӡ༻Λશମతʹݟ͢͜ͱʹ• ίϯϙʔωϯτׂͱࣗલΠϯϑϥͷҰݩԽΛߦͬͨ• ਨߏ → ਫฏߏ ͷసͰཧׂ୲͕͘͢͠ͳͬͨ