Developers Boostで発表した資料になります。
https://event.shoeisha.jp/devboost/20181215/session/1899/ https://ota42y.com/blog/2018/12/01/developper_boost/
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠Server side engineer@ota42y
View Slide
3ͭͷ࣭
1/3ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠3ͭͷ࣭
2/3ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠3ͭͷ࣭
BEFORE AFTER3/3ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠3ͭͷ࣭
࠷ޙ͚ͩҙݟׂ͕ΕΔݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠3ͭͷ࣭
“ͷ͞͠”Λ୳ͦ͏
ɾಉ͡ʮͷ͞͠ʯͳΒಉ͡ൺֱ݁Ռɾಉ͡ೝࣝΛڞ༗Ͱ͖ΔԿ͔ͷج४ʮͷ͞͠ʯΛͬͯൺֱମॏ ڑݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏
ɾܧଓɾετʔϦʔϙΠϯτɾॲཧ࣌ؒࣄʹ͏ʮͷ͞͠ʯͨ͘͞Μ͋Δݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏
ɾͬͪ͜ͷํ͕ͳΜ͔͍͍ɾ͋ͱগ͠ͰऴΘΓ·͢ɾྑ͍ײ͡ʹ࣮͠ͱ͍ͯňͷ͞͠ʯ͕ͳ͍ͱೝࣝͷζϨ͕ى͖Δ→ ίϛϡχέʔγϣϯϛεਓʹΑͬͯೝ͕ࣝζϨ͍͢ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏
ňͷ͞͠ʯศརݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏ܧଓDAU, ച্, རӹ, ߘ, ϨϏϡʔͷ, ͍߹ΘͤPV, ΫϦοΫ, ฏۉߪങֹۚ, όά etc…ܭΓ͍͢ͷܭΓʹ͍͘ͷΞχϝʔγϣϯͷྑ͞, ͔ͬ͜Α͞, Θ͔Γ͢͞, ϥϯΩϯάͷྑ͞,Ϣʔβͷຬɾෆຬɾ͖۩߹ etc…
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏ɾࣗͷ࣋ͭʮͷ͞͠ʯ͕ରԠͰ͖ͳ͍࣌ɾརӹച্ͱ͔ͰؒతʹܭΕΔ͚Ͳ…Կϲ݄͔͔ΔʁܭΓʹ͍͘έʔεʹग़͘Θ͔͢
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ୳ͦ͏ɾ୳͠ํͷ࣮ྫΛհɹ— ͍͠ಉ͡ೝࣝͰͤΔɹ— ྑ͍ѱ͍Λૉૣ͘அͰ͖Δɹ— ࣗಈԽͷԸܙಘΒΕΔࣗͰɺඞཁͳʮͷ͞͠ʯΛ୳ͦ͏
ࣗݾհ
גࣜձࣾFiNC Technologies— αʔόʔαΠυΤϯδχΞ@ota42y→ Twitter, GitHubݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯࣗ͘͠ݾհۀ— rubyͱ͔rustͱ͔goͱ͔C++ͱ͔— αʔόϨεͨ͠Γ— GPUͰ༡ΜͩΓ— ػցֶशͨ͠Γ— ElasticSearchͨ͠Γ৭ʑ…
എܠઆ໌
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌ɾDBͷσʔλΛొɾ໊લΛݕࡧͯ͠બͿొ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌ݕࡧγεςϜ
→ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌ɾσʔλࣗମ݁ߏ͋Δ୳ͯ͠Δσʔλ͕ͳ͔ͳ͔ݟ͔ͭΒͳ͍ɹɾ20ສ݅͘Β͍ɹɾશ͘ݟ͔ͭΒͳ͍ମݧʹͳΒͳ͍ͣྑ͍ݕࡧΛఏڙ͍ͨ͠ʂɾΑ͘ݟΔͱԼͷํʹग़͍ͯΔɹɾ̏̌൪ͱ͔
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌ɾ͋Δ1ͭͷ݁Ռͷྑ͞ͳΜͱͳ͘Θ͔ΔɾਓʹΑͬͯྑ͞ͷج४͕ҧ͏ɾଞͷΫΤϦͷѱӨڹௐ͖Εͳ͍ɹ — ຯḩϥʔϝϯͷॱҐΛ্͛ΔͨΊʹຯḩͷॏΈΛ্͛Δɹ— ผͷΫΤϦͰຯḩΧπຯḩ͓ͰΜ͕1൪্ʹ…ྑ͍ݕࡧͱԿ͔?ͦͯ͠Ͳ͏ܭΔͷ͔?
ɾňྑ͘ͳͬͨؾ͕͢Δʯͱ͔͠ݴ͑ͳ͍ɾ࣮είΞͷॏΈ͚͕ਖ਼͍͔͠ղΒͳ͍ɾશମͱͯ͠ࠅ͘ͳ͍ͬͯΔՄೳੑेʹ͋Δݕࡧ݁Ռͷʮͷ͞͠ʯ͕ͳ͍ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌
ɾ݁Ռ͕Θ͔Δͷ͕͔࣌ؒͨͬͯΒɹ— ѱ͍ঢ়ଶͷΞϓϦΛϢʔβʹఏڙͯ͠͠·͏ɾී௨ѱ͍ͷΛੈʹग़͢͜ͱແ͍ɹ— ͋Δఔྑ͍֬৴Λ࣋ͬͯϢʔβʹग़͢ɹ— ࠓճྑ͍͔ѱ͍͔Θ͔Βͳ͍ɹɹɹ— ѱ͍ͷΛੈʹग़ͯ͠͠·͏ύλʔϯ͋ΔϢʔβͷԠΛݟΔ͔?ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌
ɾͲΕ͘Β͍ྑ͘ͳ͔͕ͬͨΘ͔Δɾಉ͡ج४Λڞ༗Ͱ͖Δɾѱ͍ঢ়ଶͰϦϦʔε͢ΔͷΛආ͚ΕΔɹ— ଟ͘ͷݕࡧ݁Ռ͕ྑ͘ͳͬͯΔͱΘ͔Δňͷ͞͠ʯ͕͋Εݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌75Έ͍ͨͳ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠എܠઆ໌ňͷ͞͠ʯ͕ཉ͍͠
“ͷ͞͠”Λ༻ҙ͢Δ
ɾͦͷܭΓํ͖ͪΜͱྑ͞Λө͍ͯ͠Δ?ɾಛఆͷύλʔϯͰมʹͳͬͨΓ͠ͳ͍͔ňͷ͞͠ʯΛθϩ͔Β࡞Δͷେมݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δ
ɾ͜ͷΞϓϦݻ༗ͷ…Ͱແͦ͞͏ɾใݕࡧใՊֶͷதͰҰେɹ— ेͷྺ࢙͕͋Δɹ— ΫΤϦͰରͷจॻΛ୳͢ύλʔϯසग़ɹ— ݕࡧϥϯΩϯάఆྔԽࢦඪ͕͋Δաڈʹ୭͔͕໘͍ͯ͠Δͷͣݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δ
ɾզʑͷΛաڈͷʹϚοϐϯά͍ͨ͠ɾաڈͷՌΛదԠͰ͖Δɾňͷ͞͠ʯͷಘखෆಘख͋ΔఔΘ͔ΔڊਓͷݞʹΓ͍ͨݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢ΔࣗୡͷΛϚοϐϯάͰ͖Δ͔?Λߟ͑Δ
ɾϢʔβ͕ΫΤϦΛೖྗɾෳͷจॻΛ݁ՌͰฦ͢ɾϢʔβ͕ΫϦοΫͨ͠ෳͷͷ͕ਖ਼ղҰൠతͳจॻݕࡧͷ֓೦ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δɾݕࡧ୯ޠΛೖྗ͠ɺͷϦετΛฦ͢ɾϢʔβΛબΜͰొ͢Δɾొ͢Δ(ଟͯ͘)1ͭɹ— ͦͦཉ͍͕͠ແ͍ύλʔϯ͋Γ͏Δɹ— Ұ୴ແࢹͯ݁͠ՌͷϥϯΩϯάʹྗࠓճͷػೳ
ɾࠓճͷػೳจॻݕࡧͷҰ෦ʹͰ͖Δɹ— ໊͚͕ͩॻ͔ΕͨจॻͱΈͳ͢ɹ— ొ͞ΕͨΛ།Ұͷਖ਼ղͱΈͳ͢ΛϚοϐϯά͢Δݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δɾਖ਼ղσʔλ͋Δఔϩά͔Β࡞ΕΔɹ— ݕࡧ୯ޠͱ݁ՌͷॱҐΛϩάΛอଘ͢Δɹ— ొͨ࣌͠ʹݕࡧϩάͱ͖ͭ͋ΘͤΔɹ— ͋ΔݕࡧͰԿ͕ొ͞Εͨʢʹਖ਼ղ͔ʣղΔ
طଘͷʮͷ͞͠ʯ͕͑ͦ͏ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λ༻ҙ͢Δ
“ͷ͞͠”ΛબͿ
MRR (Mean Reciprocal Rank)࠷ॳʹͰͨਖ਼ղͷΈΛߟྀ͢ΔධՁख๏ݕࡧ݁ՌͷධՁख๏ͱͯ͠MRRΛ࠾༻ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛબͿ
ɾ֓೦͕؆୯Ͱଟ͘ͷਓ͕ཧղ͍͢͠ɾ݁Ռ͕୯ҰͷࣈͳͷͰγϯϓϧɾָ࣮͕Ͱૣ͘վળͰ͖Δɾਖ਼ղ͕1ͭͳͷͰܽͷ1ͭແࢹͰ͖Δɹ— ࠷ॳͷਖ਼ղ͔͠ݟͳ͍͕ɺ࠷ॳ͔͠ͳ͍ɹ— ෳߟྀ͢ΔMAPͱಉ݁͡ՌʹͳΔͣݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛબͿख๏બఆཧ༝
ňͷ͞͠ʯΛखʹೖΕͨݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛબͿ
“ͷ͞͠”Λͬͯվળ
ɾݱࡏͷঢ়ଶΛܭΔɾվળํ๏Λߟ͑Δɾࢼ͢ɾ݁ՌΛʮͷ͞͠ʯͰܭΔɾϦϦʔε͢Δݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛͬͯվળͲͷΑ͏ʹվળ͍ͯ͘͠ͷ͔
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λͬͯվળݱࡏͷঢ়ଶΛܭΔɾొ͞Εͨͷ্Ґ2000݅ΛͬͯMRRΛܭࢉɹ— શ෦ߟྀ͢Δͷେɹ— ૯ొͷ͔ͳΓͷׂ߹ΛΊΔ্ҐʹߜΔɹɹ — ԼҐͷӨڹখ͍͞ͷͰ…ɾ݁Ռͱͯ͠MRR=0.55͙Β͍ɹ— ݕࡧϩάͱొϩά͔Βਖ਼ղΛܭࢉͰ͖Δɹ— ݕࡧϩά͔ΒॱҐΛऔΓग़͠MRRΛܭࢉ͢Δ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λͬͯվળվળํ๏Λߟ͑ΔɾMRRΛ্ঢͤ͞Εྑ͘ͳͬͨͱݴ͑Δɾ্ঢ͢ΔύϥϝʔλΛߟ͑Δɹ— ݕࡧ෦Elasticsearchɹɹɹ— ύϥϝʔλΛมߋ͢ΔͱϥϯΩϯά͕͍͡ΕΔɹɹɹ— ͲͷཁૉͷॏΈΛॏ͘͢Δ͔ɹɹɹ— ొɺͷଐੑɺetc…
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λͬͯվળࢼ͢ɾElasticsearchͷύϥϝʔλͷॏΈΛม͑Δɹ— ύϥϝʔλશ෦ొɹ— ݕࡧΫΤϦͰॏΈΛม͑Δɹ— MRR͕େ͖͘ͳΔॏΈͷΈ߹ΘͤΛߟ͑Δ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛͬͯվળɾΑ͍ॏΈ(ύϥϝʔλ)ͷ߹ͤ୳ࡧػցֶशܥͩͱසग़ύϥϝʔλͷ߹ͤΛ୳ࡧ͢ΔɾHyperoptɹ— ྑ͍ύϥϝʔλΛ୳ࡧ͢ΔPythonϥΠϒϥϦɹ— MRR͕ྑ͘ͳΔΑ͏ʹ୳ࡧΛߦ͏ɹɹ — ElasticsearchʹΫΤϦΛ͛ͯMRRΛܭࢉͯ͘͠ɹɹ — ྑ͍ݕࡧ㲈ྑ͍MRRΛࣗಈͰ୳ࡧͰ͖Δྑ͞Λ୯ҰͷࣈͰఆٛͯ͠ΔͷͰ୳ࡧ؆୯
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”Λͬͯվળྑ͍݁ՌʹͳΔΫΤϦΛ୳ࡧ
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛͬͯվળɾखಈͰௐͨ͠߹ΑΓྑ͘ͳͬͨɹ— ॏཁࢹͯ͠ͳ͔ͬͨύϥϝʔλͷӨڹ͕େ͖͘ɺखಈͰ͔ͬͨ݁͠Ռʹ݁ՌΛʮͷ͞͠ʯͰܭΔMRRແௐ 0.55खಈௐ 0.68Hyperopt 0.76
ݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠“ͷ͞͠”ΛͬͯվળϦϦʔε͢ΔɾA/BςετͰ࠷ऴ֬ೝɹ— ݕࡧͷྑ͕͞ͲΕ͘Β͍KPIʹڹ͔͘ະɹ— ྑ͍ͷΛϢʔβٻΊͯͳ͔ͬͨՄೳੑɾ݁Ռͱͯ͠ޭɹ— ແௐύϥϝʔλͷϢʔβΑΓߘ͕5%૿Ճͨ͠ɹ— ৯ࣄʹؔ͢Δ͝ҙݟϨϏϡʔ10͔݅ۙ͘Β΄΅0
·ͱΊ
ɾͳΜͱͳ͔͘Βɺڞ௨ೝࣝʹ͢Δɾݟ͑ʹ͍͘ͷΛݟ͑ΔΑ͏ʹ͢Δňͷ͞͠ʯ͕େࣄݕࡧ݁Ռͷྑ͞Λܭଌͯ͠ఆྔతʹվળ͍ͯ͘͠·ͱΊňͷ͞͠ʯΛ୳͢ɾ͍͔ʹطଘͷʹམͱ͠ࠐΉ͔ɾΛཧͯ͠ڊਓͷݞʹΔɾňͷ͞͠ʯ͕Ͱ͖ΕԠ༻ޮ͘
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ- Thank You -