sexta-feira, 6 de outubro de 2017

Jupyter Notebook na Nuvem para Analises com muitos Dados

Olá pessoal, tudo bem?

Hoje vou mostrar como configurar o ambiente Jupyter Notebook em um servidor remoto, de forma fácil e que nos permita aproveitar a flexibilidade da nuvem para fazer nossas analises de dados.

Mas o que é Jupyter Notebook e por que instala-lo em um servidor?


O Jupyter é, segundo o site do projeto, uma aplicação web de código aberto que permite criar e compartilhar documentos que contenham código vivo, equações, visualizações e texto explicativo. Ele é um dos principais ambientes para a análise de dados, onde você pode usar não apenas Python mas várias outras linguagens como você pode ver aqui.

Normalmente, o Jupyter é instalado localmente e fica disponível na porta 8888 em localhost quando iniciado. Instala-lo em um servidor se torna útil quando o volume de dados a ser analisado é maior que a memória RAM disponível. Existem outras opções nestes casos, como processar os dados em lotes, usar processamento distribuído e etc, mas nenhuma delas é tão simples quanto ter todos os dados em memória. Pretendo abordar algumas dessas opções aqui no blog, mas farei isso quando surgir a necessidade!



Vamos a configuração!


Supondo que você já iniciou seu servidor em sua cloud de preferencia (AWS, Azure, Google...), o primeiro passo é atualizar o sistema e instalar algumas dependências. Eu estou usando Ubuntu 16.04 na AWS. Acesse o servidor por SSH e execute os seguintes comandos:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python3-dev python3-pip
$ sudo pip3 install -U pip

Ao final o SO estará atualizado e o pip instalado e atualizado. Vamos agora a instalação do Jupyter.

$ sudo pip install jupyter

Veja se ao final do procedimento existe o texto "Successfully installed" seguido de uma grande lista de bibliotecas.

Vamos iniciar o Jupyter e acessar o ambiente!

$ jupyter notebook --no-browser --port=8888

Você verá, ao final, uma saída como esta:
    
Copy/paste this URL into your browser when you connect for the first time, to login with a token: http://localhost:8888/?token=1234

Mas o ambiente não será acessível substituindo o localhost pelo IP do seu servidor, esta é uma configuração de segurança do Jupyter. Para acessa-lo, faremos um "túnel" ssh.

No seu computador (em outro terminal que não seja aquele que você acessou seu servidor) rode este comando:

$ ssh -i /caminho/para/chave.pem -NL 9999:localhost:8888 ubuntu@ip.do.seu.servidor

Este comando "conecta" sua porta 9999 local com a porta 8888 do servidor e torna seu Jupyter remoto acessível localmente em http://localhost:9999/tree

No primeiro acesso é possível que ele peça um token, este token é mostrado no terminal quando iniciamos o Jupyter e aqui no texto esta representado pelo numero "1234" em negrito ali em cima.

E esta feito! Agora você pode rodar suas analises com o poder e flexibilidade da nuvem ;-)

Observações e Considerações


Vamos a algumas pontos importantes:

1 - Por mais que você acesse o Jupyter localmente (em localhost), ele esta rodando no servidor, não esqueça! Isso quer dizer que as demais dependências para sua analise precisam ser instaladas lá no servidor e todos os arquivos serão salvos no disco deste servidor.

2 - O Jupyter oferece muitas opções de configuração, você pode configura-lo para aumentar a segurança do ambiente habilitando HTTPS e/ou senhas ou até torna-lo acessível diretamente pelo IP do servidor. Tenha em mente que a segurança aqui é mantida pelo "túnel" SSH que permite deixar apenas a porta 22 do servidor aberta para conexão.

3 - Este é apenas o setup inicial, a partir daqui você tem muitas opções. Eu, por exemplo, configurei o Jupyter para iniciar automaticamente com supervisor e criei uma imagem deste servidor para poder recria-lo sempre que necessário (mais memória, mais CPU, mais GPU e etc).

Este é um conteúdo bem básico, mas não encontrei nenhum material similar no nosso idioma e por isso aqui esta! =D

Comentem aqui o que acharam, dúvidas, sugestões e sobre o que gostariam de ler aqui no blog! Espero ter ajudado! Um abraço!

Nenhum comentário:

Postar um comentário