top of page
  • Foto do escritorJoão Ataide

Estimando tempo de projetos de deep learning usando simulação e cadeias de Markov

Atualizado: 15 de fev. de 2023


 


Um dos grandes problemas de quando realiza-se um trabalho de treinamento de modelos de inteligência artificial, é que muitas vezes estamos muito próximos das bordas do estado da arte de uma nova técnica, no entanto, muitas vezes, temos que realizar estimativas do tempo que demandaríamos para realizar um treinamento de um modelo para entrar em produção.


No entanto, para realizar o treinamento de um modelo, muitas etapas são realizadas e que muitas vezes são repetidas para chegar em um resultado esperado, isso claro, se você realizar todos os passos de delimitação de pesquisa e tudo mais.


Os passos normais para realizar esse trabalho se dividem em Amostra, Treino, Validação e Produção, que muitas vezes são confundidos como uma sequência linear de procedimentos, no entanto fazem parte de uma rede muito complexa que pode ser entendida como rede de conexões de etapas que possuem probabilidade de passar ou voltar para mesma etapa.


Desta forma, podemos então realizar uma estimativa utilizando o método de cadeias de Markov.


Para o trabalho aqui, precisaremos realizar somente a importação de quatro bibliotecas do python.


import numpy as np 
import random as rm 
import pandas as pd 
import matplotlib.pyplot as plt

Com início dos problemas do Grafo, a definição dos estados de treinamento do modelo.


estados_desenvolvimento = ["Amostra", "Treino", "Validação","Produção"]

Seguido então pela matriz de sequências possíveis...


sequencias = [["Amostra -> Amostra", "Amostra -> Treino",
               "Amostra -> Validação", "Amostra -> Produção"],
               ["Treino -> Amostra", "Treino -> Treino",
               "Treino -> Validação", "Treino -> Produção"],
               ["Validação -> Amostra", "Validação -> Treino",
               "Validação -> Validação", "Validação -> Produção"],
               ["Produção -> Amostra", "Produção -> Treino",
               "Produção -> Validação", "Produção -> Produção"]] 

E as probabilidades de mudança de estado. No entanto, as presentes probabilidades foram definidas por meio de uma discurssão um pouco qualitativa sobre as dificuldades do processo, sendo indicado usar dados reais, caso queira replicar e tiver informações.


prob_sequencia = [[0.4, 0.6, 0.0, 0.0],
                  [0.2, 0.5, 0.3, 0.0],
                  [0.3, 0.4, 0.0, 0.3],
                  [0.3, 0.5, 0.2, 0.0]]

As funções que criei para o trabalho, podem ser vistos no Notebook, não vou me atentar muito ao código, mas sim ao método e resultados.


Com as probabilidades podemos então estimar o próximo estado que virá na sequência, começando pelo estado inicial de "Amostra".


estato_atual = 'Amostra'

atividades_modelo.next_state(current_state = estato_atual)

>>> "Treino"

Então, se adotarmos que a mudança de cada estado demandaria 1 semana, podemos realizar simulações durante um número determinado de semana.



numero_semanas  = 10

resultado = atividades_modelo.generate_states(current_state = estato_atual, no = numero_semanas)

>>> ['Treino', 'Validação', 'Treino', 'Validação', 'Treino', 'Amostra',
 'Treino', 'Treino', m'Validação', 'Amostra']

Podendo definir também qual está no final, que queremos encerrar a nossa simulação, neste caso, como qualquer modelo queremos colocar ele em produção.



estato_futuro = 'Produção'

resultado = atividades_modelo.generate_especific_states(current_state = estato_atual, stop_state = estato_futuro )

>>> ['Treino', 'Amostra', 'Treino', 'Treino', 'Amostra', 'Treino',
 'Validação','Amostra', 'Treino', 'Treino', 'Amostra', 'Treino', 
 'Amostra', 'Treino', 'Treino', 'Amostra', 'Amostra', 'Amostra',
 'Treino', 'Treino', 'Treino', 'Treino', 'Amostra', 'Treino',
 'Amostra', 'Amostra', 'Amostra', 'Treino', 'Treino', 'Treino',
 'Treino', 'Validação', 'Produção']

Chegando então até determinado estado final, podemos realizar essa operação várias vezes, assim, podendo definir, por exemplo, a média de tempo para realizar o treinamento dos modelos, que neste caso foi de 21 semanas.



Além disso, é possível analisar graficamente o resultado das simulações e então identificar o máximo de dias dentro dessas simulações que poderia demandar, que neste caso foi de 118 semanas.



Com isso, podemos definir os limites de tempo para realizar a entrega de trabalho, com o número máximo, neste caso, 16 semanas (4 meses) e o mínimo 4 semanas (1 ciclo completo de treino para produção).


simulacoes = 300
semana_maxima = 16
semana_min = 4

resultado = atividades_modelo.generate_risc(current_state = estato_atual,                                             stop_state = estato_futuro, nn = semana_min, nm = semana_maxima,  sm = simulacoes )

print(f"Dá Errado {round(resultado[3],2)} % \nDá Certo {round(resultado[4],2)} %")

>>> 
Dá Errado 52.67 % 
Dá Certo 47.33 %

Assim podemos definir que com base nas probabilidades das etapas para realizar o trabalho de treinamento de um modelo de deep learning, com prazo máximo de entrega de 16 meses, temos uma chance de 52.67% de extrapolar o tempo limitante do cronograma.


Tendo então, o limite máximo de 16 semanas não podendo ser alterado, pode-se então realizar a alteração de outras variáveis como a probabilidade de mudança das etapas. Um exemplo seria, diminuir as probabilidades de ciclos entre o Treino -> Amostra e Treino -> Treino. Essas melhorias poderiam ser realizadas em processamento de imagens com base no trabalho já realizando ou melhorando o desempenho da máquina que está realizando o treinamento, diminuindo a escala de tempo evitando que o treino passe uma semana.

bottom of page