{"id":89110,"date":"2020-07-18T19:42:10","date_gmt":"2020-07-18T17:42:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej"},"modified":"2020-07-18T19:42:10","modified_gmt":"2020-07-18T17:42:10","slug":"obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Introdu\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p>Ol\u00e1!<\/p>\n<p><\/p>\n<p>Neste artigo, compartilharei minha experi\u00eancia na constru\u00e7\u00e3o de uma arquitetura de microsservi\u00e7os para um projeto que utiliza redes neurais.<\/p>\n<p><\/p>\n<p>Vamos discutir os requisitos da arquitetura, olhar diferentes Diagramas Estruturais, analisar cada um dos componentes da arquitetura pronta e tamb\u00e9m avaliar as m\u00e9tricas t\u00e9cnicas da solu\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Boa leitura!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Um pouco sobre a tarefa e sua solu\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p>A ideia principal \u00e9 avaliar a atratividade de uma pessoa com base em uma foto, utilizando uma escala de dez pontos.<\/p>\n<p><\/p>\n<p>Neste artigo, nos afastaremos da descri\u00e7\u00e3o das redes neurais utilizadas e do processo de prepara\u00e7\u00e3o de dados e treinamento. No entanto, em uma das pr\u00f3ximas publica\u00e7\u00f5es, certamente voltaremos \u00e0 an\u00e1lise do pipeline de avalia\u00e7\u00e3o em um n\u00edvel mais aprofundado.<\/p>\n<p><\/p>\n<p>Agora, faremos uma vis\u00e3o geral do pipeline de avalia\u00e7\u00e3o, concentrando-nos na intera\u00e7\u00e3o dos microsservi\u00e7os no contexto da arquitetura geral do projeto.\u00a0<\/p>\n<p><\/p>\n<p>Ao trabalhar no pipeline de avalia\u00e7\u00e3o de atratividade, a tarefa foi decomposta nas seguintes partes:<\/p>\n<p><\/p>\n<ol>\n<li>Detec\u00e7\u00e3o de rostos na foto<\/li>\n<li>Avalia\u00e7\u00e3o de cada um dos rostos<\/li>\n<li>Renderiza\u00e7\u00e3o do resultado<\/li>\n<\/ol>\n<p><\/p>\n<p>A primeira \u00e9 resolvida com um modelo pr\u00e9-treinado de <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. Para a segunda, uma rede neural convolucional foi treinada no PyTorch, usando como backbone <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 equilibrando \"qualidade \/ velocidade de infer\u00eancia em CPU\"<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagrama funcional do pipeline de avalia\u00e7\u00e3o<\/i><\/p>\n<p><\/p>\n<h2>An\u00e1lise dos requisitos da arquitetura do projeto<\/h2>\n<p><\/p>\n<p>No ciclo de vida <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> do projeto, as etapas de trabalho na arquitetura e automatiza\u00e7\u00e3o do despliegue do modelo s\u00e3o muitas vezes as mais dispendiosas em tempo e recursos.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Ciclo de vida de um projeto de ML<\/i><\/p>\n<p><\/p>\n<p>Este projeto n\u00e3o \u00e9 uma exce\u00e7\u00e3o - foi tomada a decis\u00e3o de encapsular o pipeline de avalia\u00e7\u00e3o em um servi\u00e7o online, para isso era necess\u00e1rio mergulhar na arquitetura. Foram definidos os seguintes requisitos b\u00e1sicos:<\/p>\n<p><\/p>\n<ol>\n<li>Um reposit\u00f3rio unificado de logs \u2013 todos os servi\u00e7os devem registrar logs em um \u00fanico lugar, que deve ser f\u00e1cil de analisar.<\/li>\n<li>Capacidade de escalabilidade horizontal do servi\u00e7o de avalia\u00e7\u00e3o \u2014 como o gargalo mais prov\u00e1vel.<\/li>\n<li>Para cada imagem deve ser alocado o mesmo n\u00famero de recursos de CPU \u2014 para evitar outliers na distribui\u00e7\u00e3o do tempo de infer\u00eancia.<\/li>\n<li>Desdobramento (re)r\u00e1pido tanto de servi\u00e7os espec\u00edficos quanto da pilha como um todo.<\/li>\n<li>Possibilidade, se necess\u00e1rio, de utilizar objetos comuns em diferentes servi\u00e7os.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Arquitetura<\/h2>\n<p><\/p>\n<p>Ap\u00f3s a an\u00e1lise dos requisitos, ficou claro que a arquitetura de microsservi\u00e7os se encaixa praticamente perfeito.<\/p>\n<p><\/p>\n<p>Para evitar problemas desnecess\u00e1rios, foi escolhido o Telegram API como frontend.<\/p>\n<p><\/p>\n<p>Primeiro, vamos considerar o diagrama estrutural da arquitetura pronta; em seguida, passaremos para a descri\u00e7\u00e3o de cada um dos componentes e formalizaremos o processo de processamento bem-sucedido da imagem.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagrama estrutural da arquitetura pronta<\/i><\/p>\n<p><\/p>\n<p>Vamos falar mais sobre cada um dos componentes do diagrama, destacando sua Responsabilidade \u00danica no processo de avalia\u00e7\u00e3o da imagem.<\/p>\n<p><\/p>\n<h3>Microsservi\u00e7o \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Este microsservi\u00e7o encapsula todas as intera\u00e7\u00f5es com o Telegram API. Podemos destacar 2 cen\u00e1rios principais \u2013 trabalhar com a imagem do usu\u00e1rio e trabalhar com o resultado do pipeline de avalia\u00e7\u00e3o. Vamos analisar ambos os cen\u00e1rios de forma geral.<\/p>\n<p><\/p>\n<p>Ao receber a mensagem do usu\u00e1rio com a imagem:<\/p>\n<p><\/p>\n<ol>\n<li>A filtragem \u00e9 realizada, consistindo nas seguintes verifica\u00e7\u00f5es:\n<ul>\n<li>Se a imagem tem o tamanho ideal<\/li>\n<li>A quantidade de imagens do usu\u00e1rio que j\u00e1 est\u00e3o na fila<\/li>\n<\/ul>\n<\/li>\n<li>Ao passar pela filtragem inicial, a imagem \u00e9 salva em um volume do Docker<\/li>\n<li>Uma tarefa \u00e9 enviada para a fila \u201cto_estimate\u201d, que inclui, entre outras coisas, o caminho da imagem que est\u00e1 em nosso volume<\/li>\n<li>Se as etapas mencionadas acima forem conclu\u00eddas com sucesso, o usu\u00e1rio receber\u00e1 uma mensagem com o tempo estimado de processamento da imagem, calculado com base no n\u00famero de tarefas na fila. Em caso de erro, o usu\u00e1rio ser\u00e1 claramente informado \u2013 por meio do envio de uma mensagem com informa\u00e7\u00f5es sobre o que pode ter dado errado. <\/li>\n<\/ol>\n<p><\/p>\n<p>Al\u00e9m disso, este microsservi\u00e7o, como um trabalhador Celery, escuta a fila \u201cafter_estimate\u201d, que \u00e9 destinada a tarefas que passaram pelo pipeline de avalia\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Ao receber uma nova tarefa de \u201cafter_estimate\u201d:<\/p>\n<p><\/p>\n<ol>\n<li>Se a imagem foi processada com sucesso \u2013 enviamos o resultado para o usu\u00e1rio; se n\u00e3o \u2013 informamos sobre o erro<\/li>\n<li>Removemos a imagem que \u00e9 o resultado do pipeline de avalia\u00e7\u00e3o<\/li>\n<\/ol>\n<p><\/p>\n<h3>Microsservi\u00e7o de avalia\u00e7\u00e3o \u00abattrai-estimator\u00bb<\/h3>\n<p><\/p>\n<p>Este microsservi\u00e7o \u00e9 um trabalhador Celery e encapsula tudo o que est\u00e1 relacionado ao pipeline de avalia\u00e7\u00e3o da imagem. O algoritmo de opera\u00e7\u00e3o aqui \u00e9 \u00fanico \u2013 vamos analis\u00e1-lo.<\/p>\n<p><\/p>\n<p>Ao receber uma nova tarefa de \u201cto_estimate\u201d:<\/p>\n<p><\/p>\n<ol>\n<li>Passamos a imagem pelo pipeline de avalia\u00e7\u00e3o:\n<ol>\n<li>Carregamos a imagem na mem\u00f3ria<\/li>\n<li>Redimensionamos a imagem para o tamanho necess\u00e1rio<\/li>\n<li>Detectamos todos os rostos (MTCNN)<\/li>\n<li>Analisamos todos os rostos (envolvemos os rostos encontrados na etapa anterior em um batch e inferimos usando ResNet34)<\/li>\n<li>Renderizamos a imagem final\n<ol>\n<li>Desenhamos bounding boxes<\/li>\n<li>Desenhamos as avalia\u00e7\u00f5es<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Removemos a imagem original do usu\u00e1rio<\/li>\n<li>Salvamos a sa\u00edda do pipeline de avalia\u00e7\u00e3o<\/li>\n<li>Colocamos a tarefa na fila \"after_estimate\", que \u00e9 ouvida pelo microservi\u00e7o \"attrai-telegram-bot\" mencionado anteriormente<\/li>\n<\/ol>\n<p><\/p>\n<h3>Graylog (+ mongoDB + Elasticsearch)<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.graylog.org\/\">Graylog<\/a><\/noindex> \u2014 \u00e9 uma solu\u00e7\u00e3o para gerenciamento centralizado de logs. Neste projeto, foi utilizada para seu prop\u00f3sito original.<\/p>\n<p><\/p>\n<p>Escolhemos essa op\u00e7\u00e3o em vez do popular <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stack, devido \u00e0 conveni\u00eancia de us\u00e1-lo com Python. Tudo o que \u00e9 necess\u00e1rio fazer para registrar no Graylog \u00e9 adicionar o GELFTCPHandler do pacote <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> aos demais manipuladores de logger root do nosso microservi\u00e7o em Python.<\/p>\n<p><\/p>\n<p>Como algu\u00e9m que trabalhou apenas com a pilha ELK anteriormente, tive uma experi\u00eancia positiva ao trabalhar com o Graylog. A \u00fanica coisa decepcionante \u00e9 a superioridade de recursos do Kibana sobre a interface web do Graylog.<\/p>\n<p><\/p>\n<h3>RabbitMQ<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">RabbitMQ<\/a><\/noindex> \u2014 \u00e9 um broker de mensagens baseado no protocolo AMQP.<\/p>\n<p><\/p>\n<p>Neste projeto, foi usado como <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">o broker mais est\u00e1vel e testado ao longo do tempo<\/a><\/noindex> para o Celery e funcionou em modo durable.<\/p>\n<p><\/p>\n<h3>Redis<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 \u00e9 um sistema de gerenciamento de banco de dados NoSQL que trabalha com estruturas de dados do tipo \"chave-valor\".<\/p>\n<p><\/p>\n<p>\u00c0s vezes, \u00e9 necess\u00e1rio usar objetos compartilhados em diferentes microservi\u00e7os em Python que implementem algumas estruturas de dados.<\/p>\n<p><\/p>\n<p>Por exemplo, o Redis armazena um hashmap do tipo \"telegram_user_id =&gt; n\u00famero de tarefas ativas na fila\", o que permite limitar o n\u00famero de solicita\u00e7\u00f5es de um \u00fanico usu\u00e1rio a um valor espec\u00edfico e, assim, prevenir ataques DoS.<\/p>\n<p><\/p>\n<h3>Formalizamos o processo de tratamento bem-sucedido de imagens<\/h3>\n<p><\/p>\n<ol>\n<li>O usu\u00e1rio envia uma imagem para o bot do Telegram<\/li>\n<li>\"attrai-telegram-bot\" recebe a mensagem da API do Telegram e a processa<\/li>\n<li>A tarefa com a imagem \u00e9 adicionada \u00e0 fila ass\u00edncrona \"to_estimate\"<\/li>\n<li>O usu\u00e1rio recebe uma mensagem com o tempo estimado para avalia\u00e7\u00e3o<\/li>\n<li>\"attrai-estimator\" pega a tarefa da fila \"to_estimate\", processa atrav\u00e9s do pipeline de avalia\u00e7\u00e3o e produz a tarefa na fila \"after_estimate\"<\/li>\n<li>O \"attrai-telegram-bot\", monitorando a fila \"after_estimate\", envia o resultado ao usu\u00e1rio<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Finalmente, ap\u00f3s revisar a arquitetura, podemos passar para uma parte igualmente interessante \u2014 DevOps<\/p>\n<p><\/p>\n<h3>Mas isso significa que voc\u00ea pode usar o mesmo arquivo docker-compose no<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/ba539d1c8197c7961d6e5e6a5c7e83c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/\">Mas isso significa que voc\u00ea pode usar o mesmo arquivo docker-compose no <\/a><\/noindex>\u00a0\u2014 sistema de clusteriza\u00e7\u00e3o, cuja funcionalidade \u00e9 implementada dentro do Docker Engine e est\u00e1 dispon\u00edvel pronto para uso.<\/p>\n<p><\/p>\n<p>Com a 'swarms', todos os n\u00f3s do nosso cluster podem ser divididos em 2 tipos \u2013 worker e manager. Nas m\u00e1quinas do primeiro tipo, grupos de cont\u00eaineres (stacks) s\u00e3o implantados, enquanto as m\u00e1quinas do segundo tipo s\u00e3o respons\u00e1veis pela escalabilidade, balanceamento e <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">outras \u00f3timas funcionalidades.<\/a><\/noindex>Os managers, por padr\u00e3o, s\u00e3o tamb\u00e9m workers.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Cluster com um leader manager e tr\u00eas workers.<\/i><\/p>\n<p><\/p>\n<p>O tamanho m\u00ednimo poss\u00edvel de um cluster \u00e9 de 1 n\u00f3, onde a \u00fanica m\u00e1quina atuar\u00e1 simultaneamente como leader manager e worker. Com base no tamanho do projeto e nas exig\u00eancias m\u00ednimas de resili\u00eancia, foi decidido adotar exatamente essa abordagem.<\/p>\n<p><\/p>\n<p>Adiantando-me, posso dizer que desde a primeira entrega em produ\u00e7\u00e3o, que ocorreu em meados de junho, n\u00e3o houve problemas relacionados \u00e0 organiza\u00e7\u00e3o deste cluster (mas isso n\u00e3o significa que essa organiza\u00e7\u00e3o seja em qualquer n\u00edvel aceit\u00e1vel em projetos de m\u00e9dio a grande porte que imp\u00f5em exig\u00eancias de resili\u00eancia).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>No modo 'swarms', o respons\u00e1vel pela implanta\u00e7\u00e3o dos stacks (conjuntos de servi\u00e7os docker) \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ele suporta configura\u00e7\u00f5es do docker-compose, permitindo usar par\u00e2metros de deploy adicionais.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Por exemplo, atrav\u00e9s destes par\u00e2metros, os recursos em cada uma das inst\u00e2ncias do microsservi\u00e7o de estimativa foram limitados (alocamos para N inst\u00e2ncias N n\u00facleos, e no pr\u00f3prio microsservi\u00e7o limitamos o n\u00famero de n\u00facleos usados pelo PyTorch a um).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">attrai_estimator:\n\u00a0\u00a0image: 'erqups\/attrai_estimator:1.2'\n\u00a0\u00a0deploy:\n\u00a0\u00a0\u00a0\u00a0replicas: 4\n\u00a0\u00a0\u00a0\u00a0resources:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0limits:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cpus: '4'\n\u00a0\u00a0\u00a0\u00a0restart_policy:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0condition: on-failure\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2026<\/code><\/pre>\n<p><\/p>\n<p>\u00c9 importante ressaltar que Redis, RabbitMQ e Graylog s\u00e3o servi\u00e7os stateful e n\u00e3o podem ser escalados t\u00e3o facilmente quanto o 'attrai-estimator'.<\/p>\n<p><\/p>\n<h3>Antecipando a pergunta \u2013 por que n\u00e3o Kubernetes?<\/h3>\n<p><\/p>\n<p>Parece que o uso do Kubernetes em projetos pequenos e m\u00e9dios \u00e9 um overhead, toda a funcionalidade necess\u00e1ria pode ser obtida com o Docker Swarm, que \u00e9 bastante amig\u00e1vel para o orquestrador de cont\u00eaineres, al\u00e9m de ter uma baixa barreira de entrada.<\/p>\n<p><\/p>\n<h3>Infraestrutura<\/h3>\n<p><\/p>\n<p>Isso tudo foi implantado em um VDS com as seguintes caracter\u00edsticas:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 n\u00facleos Intel\u00ae Xeon\u00ae Gold 5120 CPU @ 2.20GHz<\/li>\n<li>RAM: 8 GB<\/li>\n<li>SSD: 160 GB<\/li>\n<\/ul>\n<p><\/p>\n<p>Ap\u00f3s testes de carga locais, parecia que, diante de um grande fluxo de usu\u00e1rios, essa m\u00e1quina seria suficiente apenas na medida.<\/p>\n<p><\/p>\n<p>Mas, logo ap\u00f3s o deployment, postei um link para um dos mais populares imageboards na CEI (sim, aquele mesmo), ap\u00f3s o que as pessoas ficaram interessadas e, em poucas horas, o servi\u00e7o processou com sucesso dezenas de milhares de imagens. Nesse momento, os recursos de CPU e RAM n\u00e3o foram utilizados nem pela metade, mesmo nos picos.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Mais um pouco de gr\u00e1ficos<\/h3>\n<p><\/p>\n<p>N\u00famero de usu\u00e1rios \u00fanicos e solicita\u00e7\u00f5es de avalia\u00e7\u00e3o, desde o momento do deployment, dependendo do dia<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Distribui\u00e7\u00e3o do tempo de infer\u00eancia do pipeline de avalia\u00e7\u00e3o<\/p>\n<p>\n<img decoding=\"async\" alt=\"Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais.\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Como resultado, obtemos um servi\u00e7o de \"monitoramento como servi\u00e7o\", automatizado na linha de produ\u00e7\u00e3o de integra\u00e7\u00e3o cont\u00ednua. O desenvolvedor ou testador precisa apenas definir a lista de m\u00e9tricas em um arquivo JSON, e tudo o mais acontece automaticamente. Obtemos um controle de qualidade transparente dos lan\u00e7amentos: todas as notifica\u00e7\u00f5es sobre desempenho, consumo de recursos ou regress\u00f5es arquitet\u00f4nicas.<\/h2>\n<p><\/p>\n<p>Resumindo, posso dizer que a arquitetura e a abordagem para a orquestra\u00e7\u00e3o de cont\u00eaineres se mostraram plenamente justificadas \u2014 mesmo nos picos, n\u00e3o houve quedas ou atrasos no tempo de processamento.\u00a0<\/p>\n<p><\/p>\n<p>Acredito que projetos de pequeno e m\u00e9dio porte, que utilizam infer\u00eancia em tempo real de redes neurais em CPU, podem adotar com sucesso as pr\u00e1ticas descritas neste artigo.<\/p>\n<p><\/p>\n<p>Adiciono que originalmente o artigo era maior, mas, para n\u00e3o postar um longo texto, decidi omitir alguns pontos neste artigo \u2014 voltaremos a eles em publica\u00e7\u00f5es futuras.<\/p>\n<p><\/p>\n<p>Voc\u00ea pode interagir com o bot no Telegram \u2014 @AttraiBot, ele funcionar\u00e1, pelo menos, at\u00e9 o final do outono de 2020. Lembro que nenhum dado do usu\u00e1rio \u00e9 armazenado \u2014 nem as imagens originais, nem os resultados do pipeline de avalia\u00e7\u00e3o \u2014 tudo \u00e9 deletado ap\u00f3s o processamento.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/511332\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442! \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0446\u0435\u043d\u0438\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! \u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u2013 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u043e\u0442\u043e \u0434\u0430\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89110","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Vis\u00e3o geral da arquitetura do servi\u00e7o para avalia\u00e7\u00e3o de apar\u00eancia com base em redes neurais | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-18T17:42:10+00:00","article:modified_time":"2020-07-18T17:42:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89110","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:16:27","updated":"2022-09-29 06:10:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}