Engenharia e Big Data

Engenharia e Big Data

Segundo o dicionário Aurélio, a palavra Engenharia significa “inventar ou fabricar engenhosamente”. Já uma simples consulta no Google revela que o termo significa “aplicar métodos científicos ou empíricos à utilização dos recursos da natureza em benefício do ser humano”. Sabe-se também que Engenharia é um curso formal em uma faculdade ou universidade em áreas como, por exemplo, Elétrica, Computação, Produção, Civil, Ambiental etc. Porém, a Computação tem as suas peculiaridades. Por ser uma área relativamente nova, não há definições sólidas, ainda, na minha opinião, para separar o que cada campo da Computação faz. Por exemplo, qual a diferença entre Análise de Sistemas e Sistemas de Informações? Qual a diferença entre Engenharia de Computação e Ciência da Computação? Não me canso de ver na Internet perguntas como essas. É claro que não são perguntas tão difíceis de se responder desde de que se recorra às velhas respostas. Um delas é que a Ciência da Computação tem foco na vida acadêmica e Engenharia tem foco em… Mas, o Cientista da Computação não tem um quê de Engenheiro quando sua função é projetar algoritmos mais performáticos? Já conhecemos várias explicações para essas perguntas, mas as divisões de trabalho na Computação continuam uma Torre de Babel.

Outra questão comum é: qual é o órgão responsável pela regulamentação da Engenharia de Computação? O CREA. Quem já tentou ver como a profissão de Engenheiro de Computação se encaixa nas regras do CREA vai saber que elas não são nada claras! Mas, as coisas costumam ter seu lado positivo. E talvez a não regulamentação flexibiliza a oportunidade de trabalho para aquelas pessoas que são de fato “Engenheiras de Soluções” e optaram por adquirir conhecimento de maneira não tradicional, seja por cursos técnicos ou comunidades na Internet. Conheço diversos profissionais em TI que são excelentes desenvolvedores de software, administradores de sistemas e de redes que não possuem graduação em Computação e são referências para mim e para vários outros colegas da área.

Mas, o que o conceito de Engenharia de Computação e suas indefinições no mercado brasileiro tem a ver com o título deste texto? Minha formação é em Engenharia de Computação e, durante toda a minha graduação, testemunhei vários colegas de curso que não sabiam o que fazer após formados. Ou melhor, em qual ou quais especialidades atuar? Na faculdade que me formei, a ênfase do curso foi Automação Industrial. No entanto, Automação Industrial é apenas uma possibilidade do que se pode fazer e, infelizmente, é ainda uma área muito fechada (pelo menos no mercado goiano, onde estou no momento). Outras opções foram ofertadas como ênfase na faculdade: Gestão em Qualidade de Software e Redes de Computadores. Porém, mesmo com essas outras opções, eu não enxergava empolgação em meus colegas, e confesso que também fiquei de certa forma frustrado com o que vi. Então, por que a existência da Engenharia de Computação com ênfase em atividades específicas se há cursos que tratam diretamente estes assuntos? Essa é a conta que não fecha.

Como as profissões tendem a desaparecer e a surgirem com outras roupagens, principalmente em um mundo onde a quantidade de conhecimento cresce vertinosamente, é possível que o profissional que é Bacharel em Engenharia de Computação ou até Elétrica com ênfase em Computação possa se sentir renovado com as novas e urgentes necessidades que o mercado atual exige. Além disso, arrisco a dizer que não necessariamente tendo como profissão original a Computação, mas também profissionais vindos de outras áreas como: biológicas, humanas, negócios etc. Até porque uma coisa que não pode ser esquecida é que o conhecimento de negócio é essencial para a criação de soluções reais. Não é só a tecnologia! É preciso saber aplicar o poder computacional que temos atualmente da maneira correta em outras áreas. Quem é da área de Computação sabe que não é fácil a “interface” de comunicação entre os profissionais de diferentes áreas.

Engenharia de Computação não é só trabalhar com Robótica ou Mecatrônica. Não é só trabalhar com Automação Industrial ou Predial, mas sim criar soluções projetadas com foco em desempenho, acurácia, segurança, isto é, em soluções que são capazes de crescer conforme a demanda do cliente sem muito esforço ou custo exorbitante. Diversas oportunidades têm surgido nos últimos anos em áreas como a Internet das Coisas (IoT), o fenômeno das Cidades Inteligentes (Smart Cities), Big Data, Data Sciente, Machine Learning etc. Dentro de todas essas novas oportunidades, há uma imensidão de aplicações que podem resolver problemas importantes e até essenciais da nossa sociedade. Soluções estas que impactarão tanto na política com decisões orientadas à dados (gestão pública participativa) ou até na área da saúde, revelando novos conhecimentos para prevenção e tratamento de diversas doenças. Tudo isso depende de um ativo muito importante: os dados.

O Big Data merece destaque especial, pois é o combustível para que os outros ramos profissionais se desenvolvam em plenitude. Big Data são dados gerados em grande escala com alta velocidade e variedade. Estes dados têm sido gerados a partir de diversas fontes como smartphones, sensores, redes sociais etc. Portanto, imagine como os dados têm crescido nos últimos anos e, por isso, armazenar Big Data é um grande desafio. Tanto Big Data quanto Ciência de dados (Data Science) são assuntos do momento, e o mercado necessita de profissionais capacitados que sejam competentes em criar canais confiáveis para transformação de dados, combinar fontes de dados, criar arquitetura de soluções e colaborar com a equipe de Data Science construindo soluções inteligentes com alto desempenho e escaláveis.

Fazer com que os dados sejam transformados em um formato útil eficientemente para análise de uma equipe de Cientistas de Dados ou de outros analistas é um grande desafio. Para atingir esse objetivo, várias habilidades são essenciais: saber dimensionar a capacidade computacional e de armazenamento de servidores, escolher soluções de Big Data adequadas ao problema tratado, adaptar ou criar algoritmos e implementações para acelerar aplicações de Machine Learning, aproveitando da melhor forma possível as arquiteturas paralelas e distribuídas de computadores atuais. Fazer tudo isso de forma eficiente e escalável é outro grande desafio. Temos Big Data, algoritmos de Machine Learning e hardwares cada vez melhores. Entretanto, agora necessita-se do profissional que seja capaz de potencializar tudo isso: o Engenheiro de Dados.

Numba para acelerar aplicações científicas feitas em Python

Numba para acelerar aplicações científicas feitas em Python

O Numba é um compilador para funções numéricas e array em Python para acelerar aplicações feitas nesta linguagem de programação. Este compilador permite paralelizar trechos de código em Python usando apenas “decorators” ou anotações. Segundo a documentação oficial, o Numba pode alcançar desempenho semelhante a C/C++ e Fortran. Ele gera código tanto para CPU quanto para GPU. Além disso, possui integração com APIs científicas do Python como o numpy. A GPU tem que ter CUDA Capability igual ou superior a 2.0. Em relação a GPU, o Numba ainda não possui suporte a paralelismo dinâmico e nem memória de textura.

http://numba.pydata.org/numba-doc/latest/cuda/index.html

Instalação do Cuda 9 em distribuições Linux baseadas no Ubuntu

Instalação do Cuda 9 em distribuições Linux baseadas no Ubuntu

Se você deseja trabalhar com algoritmos de Machine Learning provavelmente você precisará usar de processamento paralelo para acelerar os resultados dos seus algoritmos. Muitos frameworks, como, por exemplo, o TensorFlow já possuem versões de certos algoritmos para executarem em GPU. E o primeiro passo para acelerar seus algoritmos com CUDA é preparar a infraestrutura do seu sistema operacional.

O sistema operacional mais usado para programar atualmente é o Linux. As distribuições Linux baseadas no Ubuntu tem se destacado quando o assunto é facilidade e suporte para preparar o ambiente de programação. Este tutorial pode ser aplicado em qualquer distribuição baseada no Ubuntu e até mesmo derivada do Red Hat, como CentOS ou Fedora, desde que sejam feitas algumas adaptações.

Este tutorial foi testado nas distribuições Ubuntu 16.04 e Linux Mint 18.2 Mate 64-bit.

Antes de qualquer passo para instalar o driver NVIDIA é necessário desabilitar o driver nouveau que vem por padrão em substituição ao driver proprietário da NVIDIA.

O primeiro passo é bloquear os módulos do driver nouveau:

Agora vamos desabilitar o módulo no kernel:

Vamos reconstruir o kernel sem o módulo nouveau:

Reinicie o sistema operacional.

Agora sim! Vamos instalar o driver NVIDIA. Para instalar o driver da NVIDIA são necessários diversos utilitários como compiladores para linguagem de programação C (GCC) e utilitários para compilação como o comando make. Em distribuições baseadas no Debian ou Ubuntu o pacote a ser instalado é o build-essential.

Faça download CUDA Toolkit no site oficial da NVIDIA.

Baixe a versão para LinuxUbuntu 16.04runfile (local)

É necessário parar a execução da interface gráfica para instalação do toolkit:

Agora execute o arquivo de instalação do CUDA Toolkit.

Para isso, vou passar como parâmetro uma opção importante para quem pretende usar o driver NVIDIA apenas para programar e não para a interface gráfica para evitar conflitos durante a programação em CUDA:

Responda as perguntas do instalador da seguinte maneira:

  1. y para a instalação num ambiente de configuração não suportado
  2. y para instalação do driver NVIDIA
  3. n para não executar o nvidia-xconfig
  4. y para instalar o Cuda 9.0 Toolkit
  5. Pressione ENTER para deixar como localização padrão do Toolkit o diretório /usr/local/cuda-9.0
  6. y para instalar um link simbólico para /usr/local/cuda
  7. y para instalar os exemplos de código (samples) para o CUDA 9.0
  8. Escolha um diretório para armazenar os exemplos de código do CUDA e pressione ENTER

Agora devemos configurar as variáveis de ambiente para que possamos usar o CUDA mais eficientemente:

Devemos guardar essas variáveis no arquivo .profile do usuário que programará em CUDA no sistema para que ao reiniciar o SO não seja necessário exportá-las novamente.

As duas linhas “export” devem vir no final do arquivo. Execute o comando source para executar os comandos “export” definidos no arquivo .profile:

Nas próximas inicializações do SO não será mais necessário executar o comando source.

Pronto!

Execute o comando nvidia-smi para ver as GPUs disponíveis no seu computador:

Verifique a versão do compilador NVCC:

Até os próximos posts!