
æ©æ¢°åŠç¿ãšãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãå€ãã®äŒæ¥ã«ãšã£ãŠãŸããŸãäžå¯æ¬ ã«ãªã£ãŠããŸãã 圌ããçŽé¢ããäž»ãªåé¡ã®1ã€ã¯ããã®çš®ã®ã¢ããªã±ãŒã·ã§ã³ã®å±éã§ãã ãã®ãããªå±éã®å®çšçã§äŸ¿å©ãªæ¹æ³ã瀺ãããã®ã§ãããã¯ã©ãŠããã¯ãããžãŒãšã¯ã©ã¹ã¿ãŒã®å°é家ã§ããå¿
èŠã¯ãããŸããã ãã®ããã«ããµãŒããŒã¬ã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ã䜿çšããŸãã
ã¯ããã«
æè¿ãæ©æ¢°åŠç¿ãŸãã¯ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ãã£ãŠäœæãããã¢ãã«ã䜿çšããŠã補åã®å€ãã®ã¿ã¹ã¯ã解決ãããŸããã å€ãã®å Žåããããã¯é·å¹Žã«ããã£ãŠåŸæ¥ã®æ±ºå®è«çææ³ã«ãã£ãŠè§£æ±ºãããŠããã¿ã¹ã¯ã§ãããMLãä»ããŠè§£æ±ºããã®ãããç°¡åã§å®äŸ¡ã«ãªããŸããã
KerasãTensorflowãªã©ã®ææ°ã®ãã¬ãŒã ã¯ãŒã¯ãšæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã®ã«ã¿ãã°ã䜿çšãããšã補åã«å¿
èŠãªç²ŸåºŠãæäŸããã¢ãã«ãç°¡åã«äœæã§ããŸãã
ç§ã®ååã¯ããããæ©æ¢°åŠç¿ã®ã³ã¢ãã£ãã£åããšåŒã³ãããã€ãã®ç¹ã§æ£ããã§ãã æãéèŠãªããšã¯ãä»æ¥ã§ã¯ã¢ãã«ã®æ€çŽ¢/ããŠã³ããŒã/ãã¬ãŒãã³ã°ã容æã§ãããã¢ãã«ãç°¡åã«å±éã§ããããã«ããããšã§ãã
ç¹°ãè¿ãã«ãªããŸãããã¹ã¿ãŒãã¢ãããå°ããªäŒç€Ÿã§åããŠãããšãã¯ãæè¡çãªã ãã§ãªãåžå Žã®åæãå«ããŠãããã«ä»®å®ã確èªããå¿
èŠããããŸãã ãã®ããã«ã¯ãã¢ãã«ãè¿
éãã€ç°¡åã«å±éããå¿
èŠããããŸããããã¯ã匷åã§ã¯ãªããäŸç¶ãšããŠãã©ãã£ãã¯ãæ³å®ããŠããŸãã
ãã®å±éã®åé¡ã解決ããããã«ãã¯ã©ãŠããã€ã¯ããµãŒãã¹ã䜿çšããããšã奜ãã§ããã
AmazonãGoogleãMicrosoftã¯æè¿ããµãŒãã¹ãšããŠæ©èœããFaaSãæäŸããŸããã ãããã¯æ¯èŒçå®äŸ¡ã§ãç°¡åã«ãããã€ã§ããŸãïŒDockerã¯å¿
èŠãããŸããïŒããŸããç¡å¶éã®æ°ã®ãšã³ãã£ãã£ã䞊è¡ããŠå®è¡ã§ããŸãã
次ã«ãTensorFlow / Kerasã¢ãã«ãAmazonã®AWS Lambda-FaaSã«ãããã€ããæ¹æ³ã説æããŸãã ãã®çµæã20,000件ã®èªèã«å¯ŸããŠ1ãã«çžåœã®ç»åäžã®ã³ã³ãã³ããèªèããAPIã ãã£ãšå®ãã§ããŸããïŒ ããããã ããã¯ç°¡åã§ããïŒ ã»ãšãã©ãªãã
ãµãŒãã¹ãšããŠã®æ©èœ
ããŸããŸãªã¿ã€ãã®ãããã€ã¢ããªã±ãŒã·ã§ã³ã®å³ãæ€èšããŠãã ããã

å·ŠåŽã«ããã®ã¯ãªã³ãã¬ãã¹-ãµãŒããŒãææããŠãããšãã§ãã 次ã«ãInfrastructure-as-a-Serviceã衚瀺ãããŸã-ããã§ã¯ãæ¢ã«ä»®æ³ãã·ã³ã§äœæ¥ããŠããŸã-ããŒã¿ã»ã³ã¿ãŒã«ãããµãŒããŒã§ãã 次ã®ã¹ãããã¯Platform-as-a-Serviceã§ããã·ã³èªäœã«ã¯ã¢ã¯ã»ã¹ã§ããªããªããŸãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã³ã³ããã管çããŸãã ãããŠæåŸã«ãã³ãŒãã®ã¿ãå¶åŸ¡ããä»ã®ãã¹ãŠãç§ãã¡ããé ãããŠããå Žåã®ãFunction-as-a-Serviceã ããã¯è¯ããã¥ãŒã¹ã§ããåŸã§èŠãããã«ããšãŠãã¯ãŒã«ãªæ©èœãæäŸããŸãã
AWS Lambdaã¯ãAWSãã©ãããã©ãŒã ã§ã®FAASã®å®è£
ã§ãã å®è£
ã«ã€ããŠç°¡åã«èª¬æããŸãã ã³ã³ããã¯zipã¢ãŒã«ã€ã[ã³ãŒã+ã©ã€ãã©ãª]ã§ãã ã³ãŒãã¯ããŒã«ã«ãã·ã³ã®ãã®ãšåãã§ãã AWSã¯ãå€éšãªã¯ãšã¹ãïŒããªã¬ãŒïŒã®æ°ã«å¿ããŠããã®ã³ãŒããã³ã³ãããŒã«ãããã€ããŸãã äžéšã«ã¯æ¬è³ªçã«å¢çç·ã¯ãããŸãããçŸåšã®å¶éã¯åæã«åäœãã1000ã³ã³ããã§ããããµããŒããéããŠç°¡åã«æ倧10000以äžã«åŒãäžããããšãã§ããŸãã

AWS Lambdaã®äž»ãªå©ç¹ïŒ
- ç°¡åã«ãããã€ïŒããã«ãŒãªãïŒ-ã³ãŒããšã©ã€ãã©ãªã®ã¿
- ããªã¬ãŒïŒAPIãS3ãSNSãDynamoDBïŒãžã®æ¥ç¶ãç°¡å
- åªããã¹ã±ãŒãªã³ã°-æ¬çªç°å¢ã§ã¯ã40,000ãè¶
ããåŒã³åºããåæã«èµ·åããŸããã ããã¯å¯èœã§ãã
- äœãé話ã³ã¹ãã BDã®ååã«ãšã£ãŠããã€ã¯ããµãŒãã¹ããµãŒãã¹ã䜿çšããããã®åŸé課éã¢ãã«ããµããŒãããããšãéèŠã§ãã ããã«ãããã¹ã±ãŒãªã³ã°æã«ã¢ãã«ã䜿çšãããŠãããã®çµæžæ§ãæ確ã«ãªããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ããµãŒããŒã¬ã¹ã«ç§»æ€ããçç±
ãŸããç§ã®äŸã§ã¯ãéçºè
ãæ©æ¢°åŠç¿ã¢ãã«ãäœæããã¬ãŒãã³ã°ãå±éã§ãããªãŒãã³ãã¬ãŒã ã¯ãŒã¯ã§ããTensorflowã䜿çšããŠããããšãæ確ã«ããŸãã çŸæç¹ã§ã¯ãããã¯ãã£ãŒãã©ãŒãã³ã°ã§æã人æ°ã®ããã©ã€ãã©ãªã§ãããå°é家ãšåå¿è
ã®äž¡æ¹ã䜿çšããŠããŸãã
çŸæç¹ã§ã¯ãæ©æ¢°åŠç¿ã¢ãã«ãå±éããäž»ãªæ¹æ³ã¯ã¯ã©ã¹ã¿ãŒã§ãã 深局åŠç¿çšã®REST APIãäœæããå Žåã次ã®ããã«ãªããŸãã

ïŒ AWSããã°ããã®ç»å ïŒ
ããã°ã£ãŠãïŒ åæã«ã次ã®ããšã«æ³šæããå¿
èŠããããŸãã
- ãã©ãã£ãã¯åæ£ã®ããžãã¯ãã¯ã©ã¹ã¿ãŒãã·ã³ã«ç»é²ãã
- ããŠã³ã¿ã€ã ãšãã¬ãŒãã®äžéç¹ãèŠã€ããããšããã¹ã±ãŒãªã³ã°ã®ããžãã¯ãèŠå®ãã
- ã³ã³ããã®åäœã®ããžãã¯ãèŠå®ããŸã-ãã®ã³ã°ãçä¿¡ãªã¯ãšã¹ãã®ç®¡ç
AWS Lambdaã§ã¯ãã¢ãŒããã¯ãã£ã¯èããåçŽã«ãªããŸãã

ãŸãããã®ã¢ãããŒãã¯éåžžã«ã¹ã±ãŒã©ãã«ã§ãã è¿œå ã®ããžãã¯ãèŠå®ããããšãªããæ倧1äžä»¶ã®åæãªã¯ãšã¹ããåŠçã§ããŸãã ãã®æ©èœã«ãããè¿œå ã®åŠçæéãå¿
èŠãªããããã¢ãŒããã¯ãã£ã¯ããŒã¯è² è·åŠçã«æé©ã§ãã
第äºã«ãåçŽãªãµãŒããŒã«æéãæ¯æãå¿
èŠã¯ãããŸããã ãµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã§ã¯ãæ¯æãã¯1ã€ã®ãªã¯ãšã¹ãã«å¯ŸããŠè¡ãããŸãã ããã¯ã25,000件ã®ãªã¯ãšã¹ããããå Žåãããããã©ã®ãããŒããæ¥ããã«é¢ä¿ãªãã25,000件ã®ãªã¯ãšã¹ãã«å¯ŸããŠã®ã¿æ¯æãããšãæå³ããŸãã ãããã£ãŠãã³ã¹ããããéæã«ãªãã ãã§ãªããã³ã¹ãèªäœãéåžžã«äœããªããŸãã ããšãã°ãåŸã§èª¬æããTensorflowã§ã¯ãã³ã¹ãã¯1ãã«ã§20ã25,000ãªã¯ãšã¹ãã§ãã åæ§ã®æ©èœãåããã¯ã©ã¹ã¿ãŒã¯ã¯ããã«ã³ã¹ããããããéåžžã«å€ãã®ãªã¯ãšã¹ãïŒ> 100äžïŒã«å¯ŸããŠã®ã¿ããåçæ§ãé«ããªããŸãã
第äžã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ãã¯ããã«å€§ãããªã£ãŠããŸãã Dockerã䜿çšããå¿
èŠã¯ãããŸãããã¹ã±ãŒãªã³ã°ãšè² è·åæ£ã®ããžãã¯ãèŠå®ããŸãã èŠããã«ãäŒç€Ÿã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ããµããŒãããããã«è¿œå ã®äººãéãå¿
èŠããªããããªããããŒã¿ã»ã³ã¿ãŒã§ãããªããããªãã¯ãããèªåã§è¡ãããšãã§ããŸãã
以äžã«ç€ºãããã«ãäžèšã®ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ãã©ã¹ãã©ã¯ãã£å
šäœãå±éããã«ã¯ãããã4è¡ã®ã³ãŒããå¿
èŠã§ãã
ãµãŒããŒã¬ã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ã®çæããæ©èœããªãã±ãŒã¹ã«ã€ããŠèšããªãã®ã¯æ£ãããããŸããã AWS Lambdaã«ã¯ãåŠçæéãšäœ¿çšå¯èœãªã¡ã¢ãªã«å³ããå¶éãããããã泚æããå¿
èŠããããŸãã
ãŸããåè¿°ããããã«ãã¯ã©ã¹ã¿ãŒã¯ç¹å®ã®æ°ã®èŠæ±ã®åŸã«åçæ§ãé«ããªããŸãã ããŒã¯è² è·ãšå€ãã®ãªã¯ãšã¹ãããªãå Žåãã¯ã©ã¹ã¿ãŒã¯ããåçæ§ãé«ããªããŸãã
第äºã«ãAWS Lambdaã®éå§æéã¯ãããã§ããæ確ã§ãïŒ100ã200ããªç§ïŒã ãã£ãŒãã©ãŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãS3ããã¢ãã«ãããŠã³ããŒãããã®ã«ããã«æéãå¿
èŠã§ãã 以äžã«ç€ºãäŸã§ã¯ãã³ãŒã«ãã¹ã¿ãŒãã¯4.5ç§ããŠã©ãŒã ã¹ã¿ãŒãã¯3ç§ã§ãã äžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¯éèŠã§ã¯ãªããããããŸããããã¢ããªã±ãŒã·ã§ã³ãåäžã®èŠæ±ãã§ããã ãæ©ãåŠçããããšã«çŠç¹ãåãããŠããå Žåãã¯ã©ã¹ã¿ãŒãããè¯ããªãã·ã§ã³ã«ãªããŸãã
ã¢ããª
ããã§ã¯ãå®éã®éšåã«ç§»ããŸãããã
ãã®äŸã§ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ããªãäžè¬çãªã¢ããªã±ãŒã·ã§ã³ã§ããç»åèªèã䜿çšããŸãã ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯å
¥åç»åãåãåãããã®äžã®ãªããžã§ã¯ãã®èª¬æãè¿ããŸãã ãããã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãç»åããã£ã«ã¿ãªã³ã°ããè€æ°ã®ç»åãã°ã«ãŒãã«åé¡ããããã«åºã䜿çšãããŠããŸãã ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã³ãã®åçãèªèããããšããŸãã

ã¡ã¢ïŒã¢ãã«ãšå
ã®ã³ãŒãã¯ãã¡ãããå
¥æã§ããŸãã
次ã®ã¹ã¿ãã¯ã䜿çšããŸãã
- ãªã¯ãšã¹ã管ççšã®ã²ãŒããŠã§ã€API
- åŠçã®ããã®AWS Lambda
- ãµãŒããŒã¬ã¹å±éãã¬ãŒã ã¯ãŒã¯
ãHello worldãã³ãŒã
éå§ããã«ã¯ããµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ãã€ã³ã¹ããŒã«ããŠæ§æããå¿
èŠããããŸãããµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãšãããã€ã«äœ¿çšããŸãã ã¬ã€ããžã®ãªã³ã¯ ã
空ã®ãã©ã«ããŒãäœæãã次ã®ã³ãã³ããå®è¡ããŸãã
serverless install -u https://github.com/ryfeus/lambda-packs/tree/master/tensorflow/source -n tensorflow cd tensorflow serverless deploy serverless invoke --function main --log
次ã®å¿çãè¿ãããŸãã
/tmp/imagenet/imagenet_synset_to_human_label_map.txt /tmp/imagenet/imagenet_2012_challenge_label_map_proto.pbtxt /tmp/imagenet/classify_image_graph_def.pb /tmp/imagenet/inputimage.jpg giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107) indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779) lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296) custard apple (score = 0.00147) earthstar (score = 0.00117)
ã芧ã®ãšãããç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã³ãïŒ0.89ïŒã®ããåçãæ£åžžã«èªèããŸããã
åºæ¥äžããã AWS Lambdaã®Tensorflowã§ç»åèªèçšã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãæ£åžžã«ãããã€ããŸããã
ã³ãŒããããã«è©³ããèããŠã¿ãŸãããã
æ§æãã¡ã€ã«ããå§ããŸãããã ããã«äœ¿çšã§ãããã®ã¯ãããŸãã-AWS Lambdaã®åºæ¬èšå®ã䜿çšããŸãã
service: tensorflow frameworkVersion: ">=1.2.0 <2.0.0" provider: name: aws runtime: python2.7 memorySize: 1536 timeout: 300 functions: main: handler: index.handler
ãã¡ã€ã« 'index.py'èªäœãèŠããšãæåã«ã¢ãã«ïŒ '.pb'ãã¡ã€ã«ïŒãAWS Lambdaã®ãã©ã«ã㌠'/ tmp /'ã«ããŠã³ããŒãããTensorflowãä»ããŠæšæºçãªæ¹æ³ã§ã€ã³ããŒãããããšãããããŸãã
以äžã¯ãç¬èªã®ã¢ãã«ãæ¿å
¥ããå Žåã«çæãã¹ãGithubã®ã³ãŒããžã®ãªã³ã¯ã§ãã
S3ã䜿çšããã¢ãã«ã®ããŠã³ããŒã ïŒ
strBucket = 'ryfeuslambda' strKey = 'tensorflow/imagenet/classify_image_graph_def.pb' strFile = '/tmp/imagenet/classify_image_graph_def.pb' downloadFromS3(strBucket,strKey,strFile) print(strFile)
ã€ã³ããŒãã¢ãã« ïŒ
def create_graph(): with tf.gfile.FastGFile(os.path.join('/tmp/imagenet/', 'classify_image_graph_def.pb'), 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) _ = tf.import_graph_def(graph_def, name='')
ç»åããŠã³ããŒã ïŒ
strFile = '/tmp/imagenet/inputimage.jpg' if ('imagelink' in event): urllib.urlretrieve(event['imagelink'], strFile) else: strBucket = 'ryfeuslambda' strKey = 'tensorflow/imagenet/cropped_panda.jpg' downloadFromS3(strBucket,strKey,strFile) print(strFile)
ã¢ãã«ããäºæž¬ãååŸãã ïŒ
softmax_tensor = sess.graph.get_tensor_by_name('softmax:0') predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_data}) predictions = np.squeeze(predictions)
ããã§ãã©ã ãã«APIãè¿œå ããŸãããã
APIã®äŸ
APIãè¿œå ããæãç°¡åãªæ¹æ³ã¯ãæ§æYAMLãã¡ã€ã«ãå€æŽããããšã§ãã
service: tensorflow frameworkVersion: ">=1.2.0 <2.0.0" provider: name: aws runtime: python2.7 memorySize: 1536 timeout: 300 functions: main: handler: index.handler events: - http: GET handler
次ã«ãåã¹ã¿ãã¯ããŸãããïŒ
serverless deploy
以äžãåŸãããŸãã
Service Information service: tensorflow stage: dev region: us-east-1 stack: tensorflow-dev api keys: None endpoints: GET - https://<urlkey>.execute-api.us-east-1.amazonaws.com/dev/handler functions: main: tensorflow-dev-main
APIããã¹ãããã«ã¯ããªã³ã¯ãšããŠåã«éãããšãã§ããŸãã
https://<urlkey>.execute-api.us-east-1.amazonaws.com/dev/handler
ãŸãã¯ãcurlã䜿çšããŸãã
curl https://<urlkey>.execute-api.us-east-1.amazonaws.com/dev/handler
ååŸããŸãïŒ
{"return": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)"}
ãããã«
ãµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãAWS LambdaããŒã¹ã®Tensorflowã¢ãã«çšã®APIãäœæããŸããã ãã¹ãŠãéåžžã«ç°¡åã«å®è¡ã§ããããã«ç®¡çããããã®ã¢ãããŒãã¯åŸæ¥ã®ã¢ãããŒããšæ¯èŒããŠå€ãã®æéãç¯çŽããŸããã
æ§æãã¡ã€ã«ãå€æŽããããšã«ãããã¹ããªãŒãã³ã°åŠçã¿ã¹ã¯çšã®SQSãªã©ãä»ã®å€ãã®AWSãµãŒãã¹ã«æ¥ç¶ããããAWS Lexã䜿çšããŠãã£ããããããäœæãããã§ããŸãã
ç§ã®è¶£å³ãšããŠããµãŒããŒã¬ã¹ããã䜿ããããããããã«å€ãã®ã©ã€ãã©ãªã移æ€ããŠããŸãã ããã§èŠã€ããããšãã§ããŸã ã MITãããžã§ã¯ãã«ã¯ã©ã€ã»ã³ã¹ããããããå®å
šã«å€æŽããŠã¿ã¹ã¯ã«äœ¿çšã§ããŸãã
ã©ã€ãã©ãªã«ã¯æ¬¡ã®äŸãå«ãŸããŸãã
- æ©æ¢°åŠç¿ïŒScikitãLightGBMïŒ
- ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ïŒSkimageãOpenCVãPILïŒ
- ããã¹ãèªèïŒTesseractïŒ
- ããã¹ãåæïŒSpacyïŒ
- Webã¹ã¯ã¬ã€ãã³ã°ïŒSeleniumãPhantomJSãlxmlïŒ
- APIãã¹ãïŒWRKãpyrestestïŒ
ä»ã®äººããããžã§ã¯ãã§ãµãŒããŒã¬ã¹ãã©ã®ããã«äœ¿çšããŠããããèŠãã®ã¯éåžžã«ããããã§ãã ã³ã¡ã³ãã®ãã£ãŒãããã¯ãšéçºã®æåãå¿
ããç¥ãããã ããã