ãšã³ããªãŒ
ÐÑОвеÑïŒ
ãã®èšäºã§ã¯ããã¥ãŒã©ã« ãããã¯ãŒã¯ã䜿çšããŠãããžã§ã¯ãã®ãã€ã¯ããµãŒãã¹ ã¢ãŒããã¯ãã£ãæ§ç¯ããç§ã®çµéšãå ±æããŸãã
ã¢ãŒããã¯ãã£ã®èŠä»¶ã«ã€ããŠè©±ããããŸããŸãªæ§é å³ã確èªããå®æããã¢ãŒããã¯ãã£ã®åã³ã³ããŒãã³ããåæãããœãªã¥ãŒã·ã§ã³ã®æè¡çææšãè©äŸ¡ããŸãã
èªæžãã楜ãã¿ãã ããïŒ
åé¡ãšãã®è§£æ±ºçã«ã€ããŠäžèš
åçãããšã«ãã®äººã®é åãXNUMX段éã§è©äŸ¡ãããšããã®ãäž»ãªèãæ¹ã§ãã
ãã®èšäºã§ã¯ã䜿çšããããã¥ãŒã©ã« ãããã¯ãŒã¯ãšãããŒã¿ã®æºåãšãã¬ãŒãã³ã°ã®ããã»ã¹ã®äž¡æ¹ã®èª¬æããé¢ããŸãã ãã ãã次ã®åºçç©ã®ããããã§ã詳现ãªã¬ãã«ã§ã®è©äŸ¡ãã€ãã©ã€ã³ã®åæã«å¿ ãæ»ããŸãã
ããã§ããããã¬ãã«ã®è©äŸ¡ãã€ãã©ã€ã³ã調ã¹ãŸãããããžã§ã¯ã ã¢ãŒããã¯ãã£å šäœã®ã³ã³ããã¹ãã«ããããã€ã¯ããµãŒãã¹ã®çžäºäœçšã«éç¹ã眮ãããŸãã
é å床è©äŸ¡ãã€ãã©ã€ã³ã«åãçµããšããã¿ã¹ã¯ã¯æ¬¡ã®ã³ã³ããŒãã³ãã«å解ãããŸããã
- åçå ã®é¡ãéžæãã
- 人ããããã®è©äŸ¡
- çµæã®ã¬ã³ããªã³ã°
XNUMX ã€ç®ã¯ãäºåã«èšç·Žãããåã«ãã£ãŠè§£æ±ºãããŸãã
æ©èœè©äŸ¡ãã€ãã©ã€ã³å³
ãããžã§ã¯ãã®ã¢ãŒããã¯ãã£èŠä»¶ã®åæ
ã©ã€ããµã€ã¯ã«ã®äžã§
ML ãããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«
ãã®ãããžã§ã¯ããäŸå€ã§ã¯ãããŸãããè©äŸ¡ãã€ãã©ã€ã³ããªã³ã©ã€ã³ ãµãŒãã¹ã«ã©ããããããšã決å®ãããŸããããã®ããã«ã¯ã建ç¯ã«æ²¡é ããå¿ èŠããããŸããã 次ã®åºæ¬çãªèŠä»¶ãç¹å®ãããŸããã
- çµ±åããããã° ã¹ãã¬ãŒãž - ãã¹ãŠã®ãµãŒãã¹ã¯ãã°ã XNUMX ãæã«æžã蟌ã¿ãåæããããããå¿ èŠããããŸãã
- è©äŸ¡ãµãŒãã¹ã®æ°Žå¹³ã¹ã±ãŒãªã³ã°ã®å¯èœæ§ - æãå¯èœæ§ã®é«ãããã«ããã¯ãšããŠ
- æšè«æéã®ååžã®æ¥å¢ãé¿ããããã«ãåç»åã®è©äŸ¡ã«ã¯åãéã®ããã»ããµ ãªãœãŒã¹ãå²ãåœãŠãå¿ èŠããããŸãã
- ç¹å®ã®ãµãŒãã¹ãšã¹ã¿ãã¯å šäœã®äž¡æ¹ã®é«é (å) ãããã€ã¡ã³ã
- å¿ èŠã«å¿ããŠãç°ãªããµãŒãã¹ã§å ±éã®ãªããžã§ã¯ãã䜿çšããå¯èœæ§
ã¢ãŒããã¯ãã£
èŠä»¶ãåæããçµæããã€ã¯ããµãŒãã¹ ã¢ãŒããã¯ãã£ãã»ãŒå®ç§ã«é©åããŠããããšãæããã«ãªããŸããã
äžèŠãªé çã®çš®ãåãé€ãããã«ãTelegram API ãããã³ããšã³ããšããŠéžæãããŸããã
ãŸããå®æããã¢ãŒããã¯ãã£ã®æ§é å³ãèŠãŠã次ã«åã³ã³ããŒãã³ãã®èª¬æã«é²ã¿ãç»ååŠçãæåããããã»ã¹ã圢åŒåããŠã¿ãŸãããã
å®æãã建ç¯ã®æ§é å³
å³ã®åã³ã³ããŒãã³ãã«ã€ããŠè©³ãã説æããç»åãè©äŸ¡ããããã»ã¹ã«ãããåäžã®è²¬ä»»ãšããŠãããã瀺ããŸãã
ãã€ã¯ããµãŒãã¹ãattrai-telegram-botã
ãã®ãã€ã¯ããµãŒãã¹ã¯ãTelegram API ãšã®ãã¹ãŠã®å¯Ÿè©±ãã«ãã»ã«åããŸãã äž»ãªã·ããªãªã¯ 2 ã€ãããŸããã«ã¹ã¿ã ã€ã¡ãŒãžã䜿çšããäœæ¥ãšãè©äŸ¡ãã€ãã©ã€ã³ã®çµæã䜿çšããäœæ¥ã§ãã äž¡æ¹ã®ã·ããªãªãèŠãŠã¿ãŸãããã
ç»åä»ãã®ã«ã¹ã¿ã ã¡ãã»ãŒãžãåä¿¡ããå Žå:
- ãã£ã«ã¿ãªã³ã°ã¯æ¬¡ã®ãã§ãã¯ã§æ§æãããŸãã
- æé©ãªç»åãµã€ãºãæã€
- ãã§ã«ãã¥ãŒã«å ¥ã£ãŠãããŠãŒã¶ãŒç»åã®æ°
- äžæ¬¡ãã£ã«ã¿ãªã³ã°ãééãããšãã€ã¡ãŒãžã¯ Docker ããªã¥ãŒã ã«ä¿åãããŸã
- ã¿ã¹ã¯ã¯ãto_estimateããã¥ãŒå ã«çæãããŸãããã®ãã¥ãŒã«ã¯ãããªã¥ãŒã å ã®ã€ã¡ãŒãžãžã®ãã¹ãªã©ã衚瀺ãããŸãã
- äžèšã®æé ãæ£åžžã«å®äºãããšããŠãŒã¶ãŒã¯ããã¥ãŒå ã®ã¿ã¹ã¯ã®æ°ã«åºã¥ããŠèšç®ãããæšå®ç»ååŠçæéãå«ãã¡ãã»ãŒãžãåãåããŸãã ãšã©ãŒãçºçããå Žåãäœãåé¡ã«ãªã£ãå¯èœæ§ããããã«ã€ããŠã®æ å ±ãå«ãã¡ãã»ãŒãžãéä¿¡ããããšã«ããããŠãŒã¶ãŒã«æ瀺çã«éç¥ãããŸãã
ãŸãããã®ãã€ã¯ããµãŒãã¹ã¯ãã»ã㪠ã¯ãŒã«ãŒãšããŠãè©äŸ¡ãã€ãã©ã€ã³ãééããã¿ã¹ã¯ã察象ãšãããafter_estimateããã¥ãŒããªãã¹ã³ããŸãã
ãafter_estimateãããæ°èŠã¿ã¹ã¯ãåä¿¡ããå ŽåïŒ
- ç»åãæ£åžžã«åŠçãããå Žåã¯çµæããŠãŒã¶ãŒã«éä¿¡ãããããã§ãªãå Žåã¯ãšã©ãŒããŠãŒã¶ãŒã«éç¥ãããŸãã
- è©äŸ¡ãã€ãã©ã€ã³ã®çµæã§ããã€ã¡ãŒãžã®åé€
Attrai-estimator è©äŸ¡ãã€ã¯ããµãŒãã¹
ãã®ãã€ã¯ããµãŒãã¹ã¯ã»ã㪠ã¯ãŒã«ãŒã§ãããç»åè©äŸ¡ãã€ãã©ã€ã³ã«é¢é£ãããã¹ãŠãã«ãã»ã«åããŸãã ããã§æ©èœããã¢ã«ãŽãªãºã 㯠XNUMX ã€ã ãã§ãããããåæããŸãã
ãto_estimateãããæ°èŠã¿ã¹ã¯ãåä¿¡ããå ŽåïŒ
- è©äŸ¡ãã€ãã©ã€ã³ãéããŠã€ã¡ãŒãžãå®è¡ããŸãã
- ç»åãã¡ã¢ãªã«ããŒããã
- ç»åããåžæã®ãµã€ãºã«èª¿æŽããŸã
- ãã¹ãŠã®é¡ãæ€çŽ¢ (MTCNN)
- ãã¹ãŠã®é¢ãè©äŸ¡ããŸã (æåŸã®æ®µèœã§èŠã€ãã£ãé¢ã ResNet34 ããããšæšè«ã§ã©ããããŸã)
- æçµã€ã¡ãŒãžã®ã¬ã³ããªã³ã°
- å¢çããã¯ã¹ãæç»ãã
- æ瞟ãæã
- ã«ã¹ã¿ã (ãªãªãžãã«) ã€ã¡ãŒãžã®åé€
- è©äŸ¡ãã€ãã©ã€ã³ããã®åºåã®ä¿å
- ã¿ã¹ã¯ããafter_estimateããã¥ãŒã«çœ®ããäžã§è§£æãããattrai-telegram-botããã€ã¯ããµãŒãã¹ã«ãã£ãŠãªãã¹ã³ãããŸãã
ã°ã¬ã€ãã° (+ mongoDB + Elasticsearch)
éžæã¯æ®éã®äººã§ã¯ãªã圌ã«äžããã
ãããŸã§ ELK ã¹ã¿ãã¯ã§ããäœæ¥ããããšããªãã£ãç§ã¯ãGraylog ã䜿çšããéã«æŠãååããªçµéšãããŠããŸããã å¯äžæ®å¿µãªã®ã¯ãKibana ã®æ©èœã Graylog Web ã€ã³ã¿ãŒãã§ã€ã¹ãããåªããŠããããšã§ãã
RabbitMQã®
ãã®ãããžã§ã¯ãã§ã¯ã次ã®ããã«äœ¿çšãããŸããã
Redisã®
å Žåã«ãã£ãŠã¯ãããŒã¿æ§é ãå®è£ ããããŸããŸãª Python ãã€ã¯ããµãŒãã¹ã§å ±éã®ãªããžã§ã¯ãã䜿çšããããšãå¿ èŠã«ãªãããšããããŸãã
ããšãã°ãRedis ã¯ãtelegram_user_id => ãã¥ãŒå ã®ã¢ã¯ãã£ããªã¿ã¹ã¯ã®æ°ããšãã圢åŒã®ããã·ã¥ããããä¿åããŸããããã«ãããXNUMX 人ã®ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãã®æ°ãç¹å®ã®å€ã«å¶éããããã«ãã£ãŠ DoS æ»æãé²ãããšãã§ããŸãã
ç»ååŠçãæåãããããã»ã¹ã圢åŒåããŸã
- ãŠãŒã¶ãŒãç»åã Telegram ãããã«éä¿¡ããŸã
- ãattrai-telegram-botã㯠Telegram API ããã¡ãã»ãŒãžãåä¿¡ããããã解æããŸã
- ç»åãå«ãã¿ã¹ã¯ãéåæãã¥ãŒãto_estimateãã«è¿œå ãããŸã
- ãŠãŒã¶ãŒã¯æšå®è©äŸ¡æéãå«ãã¡ãã»ãŒãžãåãåããŸã
- ãattrai-estimatorãã¯ãto_estimateããã¥ãŒããã¿ã¹ã¯ãååŸãããã€ãã©ã€ã³ãéããŠæšå®ãå®è¡ãããafter_estimateããã¥ãŒã«ã¿ã¹ã¯ãçæããŸãã
- ãafter_estimateããã¥ãŒããªãã¹ã³ãããattrai-telegram-botããçµæããŠãŒã¶ãŒã«éä¿¡ããŸã
DevOps
æåŸã«ãã¢ãŒããã¯ãã£ã確èªããåŸãåæ§ã«èå³æ·±ãéšåã§ãã DevOps ã«é²ãããšãã§ããŸãã
DockerSwarm
ãswarmãã®å©ããåããŠãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒããã¯ãŒã«ãŒãšãããŒãžã£ãŒã® 2 ã€ã®ã¿ã€ãã«åããããšãã§ããŸãã æåã®ã¿ã€ãã®ãã·ã³ã§ã¯ã³ã³ããã®ã°ã«ãŒã (ã¹ã¿ãã¯) ããããã€ãããXNUMX çªç®ã®ã¿ã€ãã®ãã·ã³ã¯ã¹ã±ãŒãªã³ã°ããã©ã³ã¹èª¿æŽãããã³
XNUMX 人ã®ãªãŒã㌠ãããŒãžã£ãŒãš XNUMX 人ã®ã¯ãŒã«ãŒãããªãã¯ã©ã¹ã¿ãŒ
å¯èœãªæå°ã¯ã©ã¹ã¿ãŒ ãµã€ãºã¯ 1 ããŒãã§ãå¯äžã®ãã·ã³ããªãŒã㌠ãããŒãžã£ãŒãšã¯ãŒã«ãŒãšããŠåæã«æ©èœããŸãã ãããžã§ã¯ãã®èŠæš¡ãšãã©ãŒã«ã ãã¬ã©ã³ã¹ã®æå°èŠä»¶ã«åºã¥ããŠããã®ã¢ãããŒãã䜿çšããããšã決å®ãããŸããã
ä»åŸã®å±æãšããŠã¯ãXNUMX æäžæ¬ã®æåã®æ¬çªé 信以æ¥ããã®ã¯ã©ã¹ã¿ãŒçµç¹ã«é¢é£ããåé¡ã¯çºçããŠããªããšèšããŸã (ãã ããããã¯ããã®ãããªçµç¹ãã©ã®åªäœã§ãå°ãªããšãããçšåºŠåãå ¥ããããããšãæå³ããããã§ã¯ãããŸãã)ã倧èŠæš¡ãªãããžã§ã¯ãã¯ãã©ãŒã«ã ãã¬ã©ã³ã¹èŠä»¶ã®å¯Ÿè±¡ãšãªããŸã)ã
ããã«ãŒã¹ã¿ãã¯
ãswarmãã¢ãŒãã§ã¯ãã¹ã¿ã㯠(Docker ãµãŒãã¹ã®ã»ãã) ã®ãããã€ã¡ã³ãã責任ãè² ããŸãã
docker-compose æ§æããµããŒãããŠããããããªãã·ã§ã³ã§ããã〠ãªãã·ã§ã³ã䜿çšã§ããŸãã
ããšãã°ããããã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠãè©äŸ¡çšãã€ã¯ããµãŒãã¹ ã€ã³ã¹ã¿ã³ã¹ããšã«ãªãœãŒã¹ãå¶éãããŸãã (N åã®ã€ã³ã¹ã¿ã³ã¹ã« N åã®ã³ã¢ãå²ãåœãŠãŸãããã€ã¯ããµãŒãã¹èªäœã§ã¯ãPyTorch ã§äœ¿çšãããã³ã¢ã®æ°ã XNUMX ã€ã«å¶éããŸã)ã
attrai_estimator:
image: 'erqups/attrai_estimator:1.2'
deploy:
replicas: 4
resources:
limits:
cpus: '4'
restart_policy:
condition: on-failure
âŠ
RedisãRabbitMQãGraylog ã¯ã¹ããŒããã« ãµãŒãã¹ã§ããããattrai-estimatorãã®ããã«åçŽã«ã¹ã±ãŒã«ããããšã¯æ©èœããªãããšã«æ³šæããããšãéèŠã§ãã
ãªã Kubernetes ã§ã¯ãªãã®ã?ãšããçåã®äºå ã§ãã
äžå°èŠæš¡ã®ãããžã§ã¯ã㧠Kubernetes ã䜿çšãããšãªãŒããŒãããã«ãªãããã§ããå¿ èŠãªæ©èœã¯ãã¹ãŠ Docker Swarm ããååŸã§ããŸããDocker Swarm ã¯ã³ã³ãã ãªãŒã±ã¹ãã¬ãŒã¿ãŒã«ãšã£ãŠéåžžã«äœ¿ãããããå°å ¥ãããå€ãäœãã§ãã
ã€ã³ãã©
ãããã¯ãã¹ãŠã次ã®ç¹æ§ãæ〠VDS ã«ãããã€ãããŸããã
- CPU: 4 ã³ã¢ Intel® Xeon® Gold 5120 CPU @ 2.20GHz
- RAM: 8 GB
- SSDïŒ160GB
ããŒã«ã«è² è·ãã¹ãã®çµæããŠãŒã¶ãŒã倧éã«æµå ¥ããå Žåã«ã¯ããã®ãã·ã³ã§ååã§ããããšãããããŸããã
ããããå°å ¥çŽåŸã«ãCIS ã§æã人æ°ã®ããã€ã¡ãŒãžããŒãã® XNUMX 〠(ã¯ããåããã®ã§ã) ãžã®ãªã³ã¯ãæçš¿ãããšããã人ã ãèå³ãæã¡ãæ°æéã§ãµãŒãã¹ã¯æ°äžæã®ç»åãåŠçããããšã«æåããŸããã åæã«ãããŒã¯æã«ã¯ãCPU ãš RAM ã®ãªãœãŒã¹ã¯ååã䜿çšãããŠããŸããã§ããã
ããã«ã°ã©ãã£ãã¯ãè¿œå
å°å ¥ä»¥éã®æ¥å¥ã®ãŠããŒã¯ ãŠãŒã¶ãŒãšè©äŸ¡ãªã¯ãšã¹ãã®æ°
æšå®ãã€ãã©ã€ã³ã®æšè«æéã®ååž
æèŠ
èŠçŽãããšãã³ã³ããã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã«å¯Ÿããã¢ãŒããã¯ãã£ãšã¢ãããŒãã¯å®å šã«æ£åœãªãã®ã§ãããããŒã¯æã§ãã£ãŠãåŠçæéã®äœäžãæ²äžã¯ãªãã£ããšèšããŸãã
ããã»ã¹ã§ CPU äžã®ãã¥ãŒã©ã« ãããã¯ãŒã¯ã®ãªã¢ã«ã¿ã€ã æšè«ã䜿çšããå°èŠæš¡ããã³äžèŠæš¡ã®ãããžã§ã¯ãã¯ããã®èšäºã§èª¬æãããã©ã¯ãã£ã¹ãããŸãå°å ¥ã§ãããšæããŸãã
æåã¯èšäºãé·ãã£ãããšãä»ãå ããŠãããŸãããé·æãæçš¿ããªãããã«ããããã«ããã®èšäºã§ã¯ããã€ãã®ç¹ãçç¥ããããšã«ããŸããããããã«ã€ããŠã¯ã次ã®åºçç©ã§åã³èª¬æããŸãã
Telegram - @AttraiBot ã§ããããæ»æããããšãã§ããŸããå°ãªããšã 2020 幎ã®ç§ã®çµãããŸã§ã¯æ©èœããŸãã 念ã®ããèšã£ãŠãããŸããããŠãŒã¶ãŒ ããŒã¿ã¯ä¿åããããå ã®ç»åãè©äŸ¡ãã€ãã©ã€ã³ã®çµæãä¿åããããåŠçåŸã«ã¯ãã¹ãŠç Žæ£ãããŸãã
åºæïŒ habr.com