Share
Embed
クックパッドの機械学習基盤 2018 / Machine Learning Platform at Cookpad ~ 2018 ~
Yuichiro Someya
February 21, 2018
Transcript
86 slides
-
ࣗݾհ છ୩༔Ұ<:VJDIJSP4PNFZB> ΫοΫύουגࣜձࣾݚڀ։ൃ෦ ϦαʔνΤϯδχΞ݄d ʰػցֶशʹඞཁͳج൫Λ "84্ʹߏங͢Δʱ UXJUUFSDPN!BZFNPT@Z
HJUIVCDPNBZFNPT IUUQTXXXBZFNPTNF -
Ϩγϐࡐྉ໊ͷ ࣗಈਖ਼نԽ ը૾ੳʹΑΔ Ϩγϐͷྨ \$MBTT^ ϑΟʔυόοΫͷ ࣗಈλά͚ ʙਓ Ϩγϐࡐྉ໊ͷ ࣗಈਖ਼نԽ
IUUQUFDIMJGFDPPLQBEDPN -
݄࣌ (16Πϯελϯε͕ཉ͍͠Πϯϑϥґཔ ʙिؒ ࣮ݧ༻ͷΞΧϯτΛ͚ɺར༻ऀ͕ࣗͰ ΠϯελϯεΛ࡞Δʁ 71$
4VCOFU ,FZ1BJS 4UPSBHFͷઃఆɺ*OUFSOBM%/4ͱͷؔ࿈ ͚ OWJEJBESJWFS $6%" DV%//ͳͲ݁ߏେม %FFQ-FBSOJOH".* ͏ͪΐͬͱະདྷͷ IUUQTBXTBNB[PODPNKQNBDIJOFMFBSOJOHBNJT -
݄࣌ (16Πϯελϯε͕ཉ͍͠Πϯϑϥґཔ ʙिؒ ࣮ݧ༻ͷΞΧϯτΛ͚ɺར༻ऀ͕ࣗͰ ΠϯελϯεΛ࡞Δʁ 71$
4VCOFU ,FZ1BJS 4UPSBHFͷઃఆɺ*OUFSOBM%/4ͱͷؔ࿈ ͚ OWJEJBESJWFS $6%" DV%//ͳͲ݁ߏେม %FFQ-FBSOJOH".* ͏ͪΐͬͱະདྷͷ IUUQTBXTBNB[PODPNKQNBDIJOFMFBSOJOHBNJT -
$6%" DV%// $6%" DV%// %FFQ-FBSOJOH".*+BO FUD DSFBUFXPSLCFODI
TMBDL@VJE6 DPNNBOEDSFBUFXPSLCFODI 0VUHPJOH8FCIPPLT MBNCEB*OWPLF -
$6%" DV%// $6%" DV%// %FFQ-FBSOJOH".*+BO FUD FD3VO*OTUBODFT
71$ 4VCOFU /BNFλά ڥಛ༗ͷઃఆ͜͜ͰΔ ΠϯελϯεʹATMBDL@VJEAΛ λά͚ͯ͠ॴ༗ऀΛཧ͢Δ *ODPNJOH8FCIPPLT TTIBZFNPTXPSLCFODIEOTDPNQBOZ خ͍͠ -
$6%" DV%// $6%" DV%// %FFQ-FBSOJOH".*+BO FUD FD3VO*OTUBODFT
71$ 4VCOFU /BNFλά ڥಛ༗ͷઃఆ͜͜ͰΔ ΠϯελϯεʹATMBDL@VJEAΛ λά͚ͯ͠ॴ༗ऀΛཧ͢Δ *ODPNJOH8FCIPPLT خ͍͠ TTIBZFNPTXPSLCFODIEOTDPNQBOZ MJTU<\NZcSVOOJOH^>JOTUBODFT<RVFSZ> -JTUFYJTUJOHJOTUBODFT TUBSU*/45/"$&@/".& 4UBSU&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU TUPQ*/45/"$&@/".& 4UPQ&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU DSFBUFXPSLCFODI803,#&/5)@5:1&<803,#&/$)@/".&> $SFBUFOFX&$XPSLCFODIXJUITQFDJpFEUZQF ".* UFSNJOBUF*/45"/$&@/".& 5FSNJOBUF&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU MJTUXPSLCFODIUZQFT -JTU&$XPSLCFODIUZQFT ".* FYJTUJOHVOEFSSBOEEBDDPVOU -
$6%" DV%// $6%" DV%// %FFQ-FBSOJOH".*+BO FUD FD3VO*OTUBODFT
71$ 4VCOFU /BNFλά ڥಛ༗ͷઃఆ͜͜ͰΔ ΠϯελϯεʹATMBDL@VJEAΛ λά͚ͯ͠ॴ༗ऀΛཧ͢Δ *ODPNJOH8FCIPPLT خ͍͠ TTIBZFNPTXPSLCFODIEOTDPNQBOZ MJTU<\NZcSVOOJOH^>JOTUBODFT<RVFSZ> -JTUFYJTUJOHJOTUBODFT TUBSU*/45/"$&@/".& 4UBSU&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU TUPQ*/45/"$&@/".& 4UPQ&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU DSFBUFXPSLCFODI803,#&/5)@5:1&<803,#&/$)@/".&> $SFBUFOFX&$XPSLCFODIXJUITQFDJpFEUZQF ".* UFSNJOBUF*/45"/$&@/".& 5FSNJOBUF&$JOTUBODFFYJTUJOHVOEFSSBOEEBDDPVOU MJTUXPSLCFODIUZQFT -JTU&$XPSLCFODIUZQFT ".* FYJTUJOHVOEFSSBOEEBDDPVOU &$Πϯελϯεʹ·ͭΘΔҰ࿈ͷૢ࡞Λ ڞ௨Խ͠ɺ$IBU#PUܦ༝Ͱఏڙ ࣮ݧతͰ͏Πϯελϯεͷઃఆ΄΅ڞ௨Խग़དྷΔ -
݄࣌ (16Πϯελϯε͕ཉ͍͠Πϯϑϥґཔ ʙिؒ ࣮ݧ༻ͷΞΧϯτΛ͚ɺར༻ऀ͕ࣗͰ ΠϯελϯεΛ࡞Δʁ 71$
4VCOFU ,FZ1BJS 4UPSBHFͷઃఆɺ*OUFSOBM%/4ͱͷؔ࿈ ͚ OWJEJBESJWFS $6%" DV%//ͳͲ݁ߏେมղܾ %FFQ-FBSOJOH".* ͏ͪΐͬͱະདྷͷ IUUQTBXTBNB[PODPNKQNBDIJOFMFBSOJOHBNJT -
ΞϓϦ ࣾγεςϜ Ϟσϧ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮ ςετʗࢹ
લॲཧ Ϟσϧ࣮ σϓϩΠ ·Ͱ -
Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮
ςετʗࢹ લॲཧ σϓϩΠ ϘτϧωοΫ ݱࡏ -
Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮
ςετʗࢹ લॲཧ σϓϩΠ ϘτϧωοΫ Ϟσϧ։ൃऀ͕૿͑ɺ ϞσϧͷσϓϩΠ࡞ۀ͕ϘτϧωοΫʹ -
ػցֶशϞσϧͷσϓϩΠ ͱ αʔόʔͷຒΊࠐΈʗύοέʔδԽʗ"1*Խʁ গͳ͘ͱࠓճ είʔϓ֎ͳࣄ ϞσϧͷपΓʹϏδωεϩδοΫΛ࣮͢Δࣄ
ྫߘΛεύϜఆͨ͠Β%#ʹదͳϑϥάΛॻ͖ࠐΉ ͜͜·Ͱ͕σϓϩΠ͞ΕͨϞσϧͷ -
ػցֶशϞσϧͷσϓϩΠ ͱ αʔόʔͷຒΊࠐΈʗύοέʔδԽʗ"1*Խʁ গͳ͘ͱࠓճ είʔϓ֎ͳࣄ ϞσϧͷपΓʹϏδωεϩδοΫΛ࣮͢Δࣄ
ྫߘΛεύϜఆͨ͠Β%#ʹదͳϑϥάΛॻ͖ࠐΉ ͜͜·Ͱ͕σϓϩΠ͞ΕͨϞσϧͷ -
αʔόʔʗΞϓϦʹΈࠐΉ ͍͍ͱ͜Ζ Ϟσϧݺͼग़͠ݩͷ௨৴Φʔόʔϔου͕ආ͚ΒΕΔ Α͘ͳ͍ͱ͜Ζ ΞϓϦέʔγϣϯίʔυΛ͍͡Δඞཁ͕͋Δ
1ZUIPOڥʹݶΒΕΔPSม͢Δඞཁ͕͋Δ Ұํ1Z$BMMͱ͍͏ͷ͋Δ άϧʔίʔυ͕ॏෳ͢Δ ͔݁͠ߏάϧʔ͕ް͔ͬͨΓ͢Δ IUUQTHJUIVCDPNNSLOQZDBMMSC -
1ZUIPOQBDLBHFʹ͢Δ ͍͍ͱ͜Ζ άϧʔίʔυͷॏෳ͕ආ͚ΒΕΔ Α͘ͳ͍ͱ͜Ζ ґવ1ZUIPOڥʹݶΒΕΔ
ख͕͔͔ؒΔ //ϑϨʔϜϫʔΫͷࣝɺ1ZUIPOͷQBDLBHJOHʹؔ͢Δ͕ࣝඞཁʹ ͳΔ ୭͕Δͷ͔ IUUQTHJUIVCDPNTUFWFBSDQZQJDMPVE -
"1*Խ͢Δ Ϟσϧ୯ମΛ"1*Խ ϞσϧΛಡΈࠐΜͰɺ֎෦ϦΫΤετʹԠͯ͡ϞσϧΛ ݺͼग़͢ബ͘খ͞ͳ"1*Λ࣮͢Δ NJDSPTFSWJDF पลͷϩδοΫ
ʰϞσϧ͕εύϜఆͨ͠Β%#ʹϑϥάΛ ཱͯΔʱ ֎෦Ͱ࣮ -
"1*Խʹඞཁͳͷ Ϟσϧ ͷEVNQ NPEFM\QC I ^ "1* BQQQZ
)551 T &OEQPJOU QSFEJDU JOGPͱ͔ ϞσϧͷಡΈࠐΈͱ*0ϋϯυϥ ࡞ۀ طଘγεςϜʗΠϯϑϥͷΠϯςάϨʔγϣϯ -#ɺϞχλϦϯάɺ%/4ʑ ࣮ߦڥ %PDLFSpMF -
Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮
ςετʗࢹ લॲཧ σϓϩΠ ϘτϧωοΫ -
σϓϩΠ Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ
όον࣮ ςετʗࢹ લॲཧ ϞσϧΛσϓϩΠ͢ΔਓΛ૿͢ -
"1*Խʹඞཁͳͷ Ϟσϧ ͷEVNQ NPEFM\QC I ^ "1* BQQQZ
)551 T &OEQPJOU QSFEJDU JOGPͱ͔ ϞσϧͷಡΈࠐΈͱ*0ϋϯυϥ ࡞ۀ طଘγεςϜʗΠϯϑϥͷΠϯςάϨʔγϣϯ -#ɺϞχλϦϯάɺ%/4ʑ ࣮ߦڥ %PDLFSpMF -
"1*Խʹඞཁͳͷ Ϟσϧ ͷEVNQ NPEFM\QC I ^ "1* BQQQZ
)551 T &OEQPJOU QSFEJDU JOGPͱ͔ ϞσϧͷಡΈࠐΈͱ*0ϋϯυϥ ࡞ۀ طଘγεςϜʗΠϯϑϥͷΠϯςάϨʔγϣϯ -#ɺϞχλϦϯάɺ%/4ʑ ࣮ߦڥ %PDLFSpMF ػցֶशͱͷυϝΠϯڞ༗ େ খ -
"1*Խʹඞཁͳͷ Ϟσϧ ͷEVNQ NPEFM\QC I ^ "1* BQQQZ
)551 T &OEQPJOU QSFEJDU JOGPͱ͔ ϞσϧͷಡΈࠐΈͱ*0ϋϯυϥ ࡞ۀ طଘγεςϜʗΠϯϑϥͷΠϯςάϨʔγϣϯ -#ɺϞχλϦϯάɺ%/4ʑ ࣮ߦڥ %PDLFSpMF ػցֶशͱͷυϝΠϯڞ༗ େ খ 3%ଆͰϋϯυϧ͍ͨ͠ൣғ ػցֶशͱڞ༗͢ΔυϝΠϯ͕େ͖͍ -
σϓϩΠ Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ
όον࣮ ςετʗࢹ લॲཧ ϞσϧΛσϓϩΠ͢ΔਓΛ૿͢ -
Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮
ςετʗࢹ લॲཧ σϓϩΠ Ϟσϧ࣮ऀ͕ࣗͰσϓϩΠ͢Δ -
"1*Խʹඞཁͳͷ Ϟσϧ ͷEVNQ NPEFM\QC I ^ "1* BQQQZ
)551 T &OEQPJOU QSFEJDU JOGPͱ͔ ϞσϧͷಡΈࠐΈͱ*0ϋϯυϥ ࡞ۀ طଘγεςϜʗΠϯϑϥͷΠϯςάϨʔγϣϯ -#ɺϞχλϦϯάɺ%/4ʑ ࣮ߦڥ %PDLFSpMF ػցֶशͱͷυϝΠϯڞ༗ େ খ -
ͱ͍͑ "1*࣮ͱ͔%PDLFSOJ[Fͱ͔ͬͨ͜ͱແ͍͠ʜ ͜ΕڥʹΑΔ͕ ଞͷ࡞ۀͳΜ͔ͩΜͩ৭ʑൃੜ͢Δ σϓϩΠ+PCͷఆٛ SVOEFDL KFOLJOT
%PDLFSJNBHFΛϏϧυͯࣾ͠ϨϙδτϦʹొ Ͳ͏ʹָ͔ʹΓ͍ͨ -
.PEFM7FSTJPO 3VOUJNF 6QMPBEANPEFMQCAXJUI *0TJHOBUVSFT 1045W\QBSFOUQSPKFDUT ^NPEFMT \ EFQMPZNFOU6SJHTQBUIUPNPEFM SVOUJNF7FSTJPO
BVUP4DBMJOH ^ ࢀর 1045W\OBNFQSPKFDUT ^QSFEJDU (PPHMF$MPVE.-&OHJOFʹΑΔσϓϩΠͷਤ $SFBUF JOQVUT PVUQVUT JOQVUT PVUQVUT -
.PEFM7FSTJPO 3VOUJNF 6QMPBEANPEFMQCAXJUI *0TJHOBUVSFT 1045W\QBSFOUQSPKFDUT ^NPEFMT \ EFQMPZNFOU6SJHTQBUIUPNPEFM SVOUJNF7FSTJPO
BVUP4DBMJOH ^ ࢀর 1045W\OBNFQSPKFDUT ^QSFEJDU (PPHMF$MPVE.-&OHJOFʹΑΔσϓϩΠͷਤ $SFBUF JOQVUT PVUQVUT JOQVUT PVUQVUT IUUQTDMPVEHPPHMFDPNNMFOHJOFEPDTSVOUJNFWFSTJPOMJTU -
.PEFM7FSTJPO 3VOUJNF 6QMPBEANPEFMQCAXJUI *0TJHOBUVSFT 1045W\QBSFOUQSPKFDUT ^NPEFMT \ EFQMPZNFOU6SJHTQBUIUPNPEFM SVOUJNF7FSTJPO
BVUP4DBMJOH ^ ࢀর 1045W\OBNFQSPKFDUT ^QSFEJDU (PPHMF$MPVE.-ʹΑΔσϓϩΠͷਤ $SFBUF JOQVUT PVUQVUT JOQVUT PVUQVUT "1*ͷ࣮ମ$MPVE.-ͤ A4JHOBUVSF%FGAΛར༻ͯ͠JOQVUPVUQVUUFOTPSΛ ಛఆ͢Δख๏Λऔ͍ͬͯΔ ༧Ί༻ҙ͞Ε࣮ͨߦڥΛࢦఆͯ͠σϓϩΠ %PDLFSJNBHF͕ෆཁ -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λ ಛఆՄೳʹ͢Δ 'MPZE)VC "NB[PO 4BHF.BLFS IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
'MPZE)VCʹΑΔσϓϩΠͷਤ SFGIUUQTEPDTqPZEIVCDPNDPNNBOETSVOTFSWF %BUBTFU NPVOUBCMFGPMEFST 1SFWJPVTUSBJOJOHKPCT &OEQPJOU BQQQZ import os from
flask import Flask, send_file, request from werkzeug.exceptions import BadRequest from werkzeug.utils import secure_filename from evaluate import ffwd_to_img ALLOWED_EXTENSIONS = set(['jpg', 'jpeg']) app = Flask(__name__) @app.route('/<path:path>', methods=["POST"]) def style_transfer(path): """ Take the input image and style transfer it """ # check if the post request has the file part if 'file' not in request.files: return BadRequest("File not present in request") file = request.files['file'] if file.filename == '': return BadRequest("File name is not present in request") if not allowed_file(file.filename): return BadRequest("Invalid file type") if file and allowed_file(file.filename): filename = secure_filename(file.filename) input_filepath = os.path.join('./images/', filename) output_filepath = os.path.join('/output/', filename) file.save(input_filepath) # Get checkpoint filename from la_muse checkpoint = request.form.get("checkpoint") or "la_muse.ckpt" ffwd_to_img(input_filepath, output_filepath, '/input/' + checkpoint, '/gpu:0') return send_file(output_filepath, mimetype='image/jpg') def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS if __name__ == '__main__': app.run(host='0.0.0.0') BQQQZ NPVOU qPZESVOFOWLFSBTQZ EBUBQBUIUPNPEFMNPEFMT NPEFTFSWF 'MPZEFYQFDUTUIJTpMF UPDPOUBJOUIFDPEFUP SVOBXFCTFSWFSBOE MJTUFOPOQPSU IUUQTEPDTqPZEIVCDPN FYBNQMFTTUZMF@USBOTGFS TFSWFNPEF https:// www.floydhub.com/ expose/ABCDEFabcdef SPVUF ॻ͘ -
'MPZE)VCʹΑΔσϓϩΠͷਤ SFGIUUQTEPDTqPZEIVCDPNDPNNBOETSVOTFSWF %BUBTFU NPVOUBCMFGPMEFST 1SFWJPVTUSBJOJOHKPCT &OEQPJOU BQQQZ import os from
flask import Flask, send_file, request from werkzeug.exceptions import BadRequest from werkzeug.utils import secure_filename from evaluate import ffwd_to_img ALLOWED_EXTENSIONS = set(['jpg', 'jpeg']) app = Flask(__name__) @app.route('/<path:path>', methods=["POST"]) def style_transfer(path): """ Take the input image and style transfer it """ # check if the post request has the file part if 'file' not in request.files: return BadRequest("File not present in request") file = request.files['file'] if file.filename == '': return BadRequest("File name is not present in request") if not allowed_file(file.filename): return BadRequest("Invalid file type") if file and allowed_file(file.filename): filename = secure_filename(file.filename) input_filepath = os.path.join('./images/', filename) output_filepath = os.path.join('/output/', filename) file.save(input_filepath) # Get checkpoint filename from la_muse checkpoint = request.form.get("checkpoint") or "la_muse.ckpt" ffwd_to_img(input_filepath, output_filepath, '/input/' + checkpoint, '/gpu:0') return send_file(output_filepath, mimetype='image/jpg') def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS if __name__ == '__main__': app.run(host='0.0.0.0') BQQQZ NPVOU qPZESVOFOWLFSBTQZ EBUBQBUIUPNPEFMNPEFMT NPEFTFSWF 'MPZEFYQFDUTUIJTpMF UPDPOUBJOUIFDPEFUP SVOBXFCTFSWFSBOE MJTUFOPOQPSU IUUQTEPDTqPZEIVCDPN FYBNQMFTTUZMF@USBOTGFS TFSWFNPEF https:// www.floydhub.com/ expose/ABCDEFabcdef SPVUF IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
'MPZE)VCʹΑΔσϓϩΠͷਤ SFGIUUQTEPDTqPZEIVCDPNDPNNBOETSVOTFSWF %BUBTFU NPVOUBCMFGPMEFST 1SFWJPVTUSBJOJOHKPCT &OEQPJOU BQQQZ import os from
flask import Flask, send_file, request from werkzeug.exceptions import BadRequest from werkzeug.utils import secure_filename from evaluate import ffwd_to_img ALLOWED_EXTENSIONS = set(['jpg', 'jpeg']) app = Flask(__name__) @app.route('/<path:path>', methods=["POST"]) def style_transfer(path): """ Take the input image and style transfer it """ # check if the post request has the file part if 'file' not in request.files: return BadRequest("File not present in request") file = request.files['file'] if file.filename == '': return BadRequest("File name is not present in request") if not allowed_file(file.filename): return BadRequest("Invalid file type") if file and allowed_file(file.filename): filename = secure_filename(file.filename) input_filepath = os.path.join('./images/', filename) output_filepath = os.path.join('/output/', filename) file.save(input_filepath) # Get checkpoint filename from la_muse checkpoint = request.form.get("checkpoint") or "la_muse.ckpt" ffwd_to_img(input_filepath, output_filepath, '/input/' + checkpoint, '/gpu:0') return send_file(output_filepath, mimetype='image/jpg') def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS if __name__ == '__main__': app.run(host='0.0.0.0') BQQQZ NPVOU qPZESVOFOWLFSBTQZ EBUBQBUIUPNPEFMNPEFMT NPEFTFSWF 'MPZEFYQFDUTUIJTpMF UPDPOUBJOUIFDPEFUP SVOBXFCTFSWFSBOE MJTUFOPOQPSU IUUQTEPDTqPZEIVCDPN FYBNQMFTTUZMF@USBOTGFS TFSWFNPEF https:// www.floydhub.com/ expose/ABCDEFabcdef SPVUF 5SBJO࣌ͱڞ௨ͷ%BUBTFU GPMEFS Λར༻ Ϟσϧͷ"SUJGBDUΛదͳॴʹNPVOU͢Δ దͳॴΛࣗͰߟ͑Δ ىಈ࣌ʹ࣮ߦڥ AFOWA Λࢦఆ %PDLFSpMFෆཁ ABQQQZAΛ࣮ͯ͠σϓϩΠ Ϟσϧͷ"SUJGBDUΛಡΈࠐΜͰ1PSUͰͭ -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λ ಛఆՄೳʹ͢Δ 'MPZE)VC ϓϦηοτ 5FOTPS'MPX ,FSBT 1Z5PSDI FUD BQQQZͰ࣮ BQQQZͰ࣮ "NB[PO 4BHF.BLFS IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
&OEQPJOU &$3 %PDLFSSFQPTJUPSZ "NB[PO4BHF.BLFSʹΑΔσϓϩΠͷਤ .PEFM"SUJGBDU GET /ping POST /invocations NPEFMTFSWFMBUFTU
#VJME1VTI NPEFMTFSWFMBUFTU %PXOMPBE TBHFNBLFS$SFBUF.PEFM TBHFNBLFS$SFBUF&OEQPJOU NPEFMUSBJOMBUFTU 5SBJOJOH+PC NPEFMUSBJOMBUFTU 6QMPBE TBHFNBLFS$SFBUF5SBJOJOH+PC 3FGIUUQTEPDTBXTBNB[PODPNTBHFNBLFSMBUFTUEH IPXJUXPSLTIPTUJOHIUNM 4BHF.BLFS1ZUIPO4%, NPEFMpU NPEFMEFQMPZ TBHFNBLFS*OWPLF&OEQPJOU NPEFMQSFEJDU -
&OEQPJOU "NB[PO4BHF.BLFSʹΑΔσϓϩΠͷਤ .PEFM"SUJGBDU GET /ping POST /invocations QSFTFUTFSWFMBUFTU %PXOMPBE TBHFNBLFS$SFBUF.PEFM
TBHFNBLFS$SFBUF&OEQPJOU 5SBJOJOH+PC QSFTFUUSBJOMBUFTU 6QMPBE TBHFNBLFS$SFBUF5SBJOJOH+PC 3FGIUUQTEPDTBXTBNB[PODPNTBHFNBLFSMBUFTUEH IPXJUXPSLTIPTUJOHIUNM 4BHF.BLFS1ZUIPO4%, QSFTFU@NPEFMpU QSFTFU@NPEFMEFQMPZ TBHFNBLFS*OWPLF&OEQPJOU QSFTFU@NPEFMQSFEJDU 1SFTFU #VJMUJO "MHPSJUINT -JOFBS-FBSOFS 9(#PPTU *NBHF$MBTTJpDBUJPO TFRTFR FUD SFGIUUQTEPDTBXTBNB[PODPN TBHFNBLFSMBUFTUEHBMHPTIUNM -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λಛ ఆՄೳʹ͢Δ 'MPZE)VC ϓϦηοτ 5FOTPS'MPX ,FSBT 1Z5PSDI FUD BQQQZͰ࣮ BQQQZͰ࣮ "NB[PO 4BHF.BLFS ϓϦηοτʗ ࣗલͷ%PDLFS JNBHFΑΓબ ෆཁ ϓϦηοτΛར༻͢Δ߹ෆཁ ಠࣗϞσϧΛʏඞཁ IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λಛ ఆՄೳʹ͢Δ 'MPZE)VC ϓϦηοτ 5FOTPS'MPX ,FSBT 1Z5PSDI FUD BQQQZͰ࣮ BQQQZͰ࣮ "NB[PO 4BHF.BLFS ϓϦηοτʗ ࣗલͷ%PDLFS JNBHFΑΓબ ෆཁ ϓϦηοτΛར༻͢Δ߹ෆཁ ಠࣗϞσϧΛʏඞཁ IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT ϓϦηοτͱͯ͠੩తͳ࣮ߦڥ Ϧετ ͕ ఏڙ͞Ε͍ͯΔ -
࣮ߦڥʹؔ͢Δߟ ʰز͔ͭͷ࣮ߦڥΛϓϦηοτͱͯ͠༻ҙͯ͠Δ͚ͩͰ σϓϩΠઌͷڥͱͯ͠ेػೳ͢Δͷ͔͠Εͳ͍ʱ .-BB4ʹ͓͚Δྫ͔ΒݟΒΕΔΑ͏ʹ %PDLFSpMFʹΑΔڥͷఆٛͷखؒΛল͚ΔՄೳੑ͕͋Δ ϓϦηοτΛࣾEPDLFSSFQPTJUPSZͰఏڙ͢ΕɺϩʔΧϧͰར
༻Ͱ͖Δ ϩʔΧϧͱσϓϩΠઌͷ࣮ߦڥΛἧ͑Δͱ͍͏ίϯςφԽ σϓϩΠͷརΛอ͍ͬͯΔ -
3VOUJNF T EPDLFSSFQPTJUPSZ LFSBTQZ TFSWFQZ ϩʔΧϧ ڥ 1VMM
%FQMPZNFOUT $MPVE 4UPSBHF 1VMM LFSBTQZ TFSWFQZ LFSBTQZ TFSWFQZ ͭ·Γ͜Μͳײ͡ 5SBJO 6QMPBE -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λಛ ఆՄೳʹ͢Δ 'MPZE)VC ϓϦηοτ 5FOTPS'MPX ,FSBT 1Z5PSDI FUD BQQQZͰ࣮ BQQQZͰ࣮ "NB[PO 4BHF.BLFS ϓϦηοτʗ ࣗલͷ%PDLFS JNBHFΑΓબ ෆཁ ϓϦηοτΛར༻͢Δ߹ෆཁ ಠࣗϞσϧΛʏඞཁ IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
ϋϯυϥ ϞσϧͷϋϯυϦϯά ͱ ϞσϧͷαʔόʔΛ࡞Δ߹ʹɺҎԼͷػೳ͕ඞཁʹͳΔ ϞσϧΛ ͓ͦΒ͘ϝϞϦʹ ಡΈࠐΉ
ೖྗ "1*αʔόʔͷ߹SFRVFTU ΛϞσϧʹ͢ Ϟσϧ͔Βͷग़ྗΛड͚औΓSFTQPOTFʹฦ͢ "1* -PBE -
ϞσϧͷϋϯυϦϯά ·ͣωοτϫʔΫͷ*0ͷॴͱܕΛಛఆ͢Δඞཁ͕͋Δ ͜͜ϑϨʔϜϫʔΫʹΑͬͯ͘Δ ωοτϫʔΫ࣮࣌ʹJOQVUPVUQVU͕ܾ·Δ߹͋Δ ,FSBT 1Z5PSDI +*5
݁ߏَ *OQVU 0VUQVU ͕ෳ͋Δ߹ʁ ඪ४ԽΛ͢ΔྲྀΕ͋Δ -
ϞσϧͷϋϯυϦϯά ·ͣωοτϫʔΫͷ*0ͷॴͱܕΛಛఆ͢Δඞཁ͕͋Δ ͜͜ϑϨʔϜϫʔΫʹΑͬͯ͘Δ ωοτϫʔΫ࣮࣌ʹJOQVUPVUQVU͕ܾ·Δ߹͋Δ ,FSBT 1Z5PSDI +*5
݁ߏَ *OQVU 0VUQVU ͕ෳ͋Δ߹ʁ ඪ४ԽΛ͢ΔྲྀΕ͋Δ IUUQTTQFBLFSEFDLDPNBZFNPT QZUPSDIUPDB⒎FUPPOOYUPTIFODFOH YVFYJNPEFSVGBMTFEFQVSPJOJUVJUF -
࣮ߦڥ 4FSWF࣮ ϞσϧͷϋϯυϦϯά ೖग़ྗͷಛఆͳͲ (PPHMF$MPVE .-&OHJOF ϓϦηοτ 5FOTPS'MPX ෆཁ ηϛΦʔτ
4JHOBUVSF%FGΛར༻ͯ͠༧Ί*0Λಛ ఆՄೳʹ͢Δ 'MPZE)VC ϓϦηοτ 5FOTPS'MPX ,FSBT 1Z5PSDI FUD BQQQZͰ࣮ BQQQZͰ࣮ "NB[PO 4BHF.BLFS ϓϦηοτʗ ࣗલͷ%PDLFS JNBHFΑΓબ ෆཁ ϓϦηοτΛར༻͢Δ߹ෆཁ 5FOTP'MPX .9/FU ಠࣗϞσϧඞཁ IUUQTEPDTqPZEIVCDPNHVJEFTFOWJSPONFOUT -
Ϟσϧͷ"1*ʹؔ͢Δߟ Ϟσϧͷ"1*ͱͯ͠ඞཁͳػೳʁ QSFEJDU IFBMUIଞʹʁ ׂΓΕ݁ߏڞ௨Խग़དྷΔ (PPHMF$MPVE.-ͷྫʹݟΔΑ͏ʹ
લड़ͨ͠ʹൺΕᘭͰ͋Δ ࣮ߦڥͱϞσϧͷϋϯυϦϯά͕ͳΜͱ͔ͳΕ "1*ͷ࣮Ͳ͏ʹͰͳΓͦ͏ -
.-BB4ͱͷ͖߹͍ํ ϓϥοτϑΥʔϜ͕αϙʔτ͢Δൣғް͘ͳͬͯ͘Δ ͣ $*$%ɺ"#ςετ $BOBSZ ͳͲ
ࠓޙ࣍ୈʹ͔ͬΔϝϦοτ͕େ͖͘ͳͬͯ͘Δ খதنͳػցֶशνʔϜͰࣗڅࣗ͢Δͷ ࠓͷͱ͜Ζ બࢶʹೖΔ -
Ϟσϧ Ϟσϧ࣮ ΞϓϦ ࣾγεςϜ σʔλऩू ܇࿅ ੳ "1*࣮ %PDLFSԽ όον࣮
ςετʗࢹ લॲཧ σϓϩΠ Ϟσϧ࣮ऀ͕ࣗͰσϓϩΠ͢Δ -
NPEFMQC 3VOUJNFEFpOJUJPOT LFSBTQZ 3VOUJNFT &$3 LFSBTQZ TFSWFQZ %PDLFSpMF TFSWFQZ
%PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF #VJME NFUBEBUBZNM name: cookpadnet model: path: model.pb input: input_1 output: final_result runtime: tensorflow -
NPEFMQC 3VOUJNFEFpOJUJPOT LFSBTQZ 3VOUJNFT &$3 LFSBTQZ TFSWFQZ %PDLFSpMF TFSWFQZ
%PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF #VJME NFUBEBUBZNM name: cookpadnet model: path: model.pb input: input_1 output: final_result runtime: tensorflow $ python deploy.py Uploading model artifacts to: s3://foo/model.pb Updating task definition... Updated: arn:aws:ecs:::task-definition/cookpadnet:1 Deploying new sevice... -
$ python deploy.py Uploading model artifacts to: s3://foo/model.pb Updating task
definition... Updated: arn:aws:ecs:::task-definition/cookpadnet:1 Deploying new sevice... &$4 NPEFMQC 3VOUJNFEFpOJUJPOT LFSBTQZ 3VOUJNFT &$3 LFSBTQZ TFSWFQZ %PDLFSpMF TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF #VJME NFUBEBUBZNM name: cookpadnet model: path: model.pb input: input_1 output: final_result runtime: tensorflow -
$ python deploy.py Uploading model artifacts to: s3://foo/model.pb Updating task
definition... Updated: arn:aws:ecs:::task-definition/cookpadnet:1 Deploying new sevice... &$4 NPEFMQC 3VOUJNFEFpOJUJPOT LFSBTQZ 3VOUJNFT &$3 LFSBTQZ TFSWFQZ %PDLFSpMF TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF UFOTPSqPXQZ TFSWFQZ %PDLFSpMF #VJME NFUBEBUBZNM name: cookpadnet model: path: model.pb input: input_1 output: final_result runtime: tensorflow DVSMEBUBCJOBSZ!GPPEKQHIPHFMCFMCBNB[POBXTDPNQSFEJDU )$POUFOU5ZQFJNBHFKQFH \ SFTVMU< < F > > ^ -
·ͱΊ ݄ɺΫοΫύουݚڀ։ൃ෦ͷൃ ࠓ·Ͱ৫ͱ֦ͯ͠େ͖ͯͨ͠ ͞ΒͳΔ֦େʹ͑͏Δεέʔϥϒϧͳ։ൃڥΛ࡞Γ͍ͨ ֤Ϟσϧ࣮ऀ͕σϓϩΠ·Ͱߦ͏ମ੍ ͔͍͍ͨ
.-BB4ͳͲͷطଘख๏Λࢀߟʹ࠷ળखΛ୳͍ͬͯΔॴ