Manual

do

Maker

.

com

Ubuntu, CUDA, OpenCV e Docker em um Dell Gaming 7000

Ubuntu, CUDA, OpenCV e Docker em um Dell Gaming 7000

Com o andar da carruagem, me vi obrigado a retomar minhas aventuras com visão computacional e inteligência artificial. Não estou nadando em dinheiro, então não pude comprar uma GTX1080, mas ainda assim estou muito satisfeito por ter adquirido um Dell Gaming 7000, que vem com uma placa de video GTX1050ti, me permitindo algumas brincadeiras interessantes.

Esse artigo foi publicado em 2018 e ainda tenho esse laptop, que ainda atende a muitos propósitos, apesar de já ter adquirido um novo. O blog inteiro foi revisado em Julho de 2023 e os artigos recebem manutenção periódica do conteúdo, caso haja alguma mudança de procedimento.

Dell Gaming 15 7000

Falando um pouco do notebook, ele é espetacular! Lindo, robusto e atende perfeitamente às minhas necessidades. Com 8GB de RAM, i7 quad (com HT, aparecendo 8 núcleos) e a placa de video offboard, permite upgrades de hardware de maneira simples, apenas removendo a tampa embaixo do note, soltando 1 parafuso. Como nada é perfeito, duas coisas não me deixaram feliz; uma é o teclado com layout inglês (que estou me adaptando), a outra é que veio com o Windows. O segundo problema já foi sanado.

 

Ubuntu por quê?

Bem, a Dell vende desse notebook com Ubuntu nativo, mas em minhas surfadas pela Internet encontrei o menor preço do mesmo modelo na Submarino. Então, como vinha com outro sistema, decidi optar pelo caminho que me garantiria menos frustrações. E de fato, foi a melhor escolha, porque tive muitos problemas para conseguir instalar o Ubuntu. Primeiramente, o pendrive que eu estava utilizando provavelmente estava com problemas porque o espaço dele é de "3. alguma coisa GB". Claro que um pendrive de 4GB não tem 4GB de espaço após colocar o sistema de arquivos, mas acredite, estava muito pequeno.

O outro problema foi em relação ao formato da tabela de partições. Quem compra notebooks de linha sabe o horror que é a tabela de partições. Tentei colocar o Linux junto ao outro sistema pra não jogar dinheiro pela janela, mas não foi possível. Bem, falta não vai fazer.

Na BIOS tive que fazer alguns ajustes, habilitando e ordenando os dispositivos de boot, trocando o modo de reconhecimento de disco para AHCI (estava em RAID) e desabilitando o UEFI, além de habilitar o modo de compatibilidade com ROMs padrão.

Após instalar o sistema operacional, instalei o KDE (meu desktop preferido) e então parti para a instalação do docker. Se desejar instalar o KDE também, siga os passos descritos em seguida, ou então pule diretamente para "Docker".

Instalar o KDE no Ubuntu

Comece adicionando o repositório do Kubunt (backports), atualize e faça o upgrade (não se preocupe, continuará a ser Ubuntu, apesar de que até o splash screen mudará):

sudo su
add-apt-repository ppa:kubuntu-ppa/backports
apt-get update && sudo apt-get dist-upgrade
apt-get install kubuntu-desktop

Em dado momento será perguntado sobre o gerenciador de sessão. Mantenha o lightdm. Pouco depois, dará um erro durante a instalação. Aplique a correção:

apt-get -f install

Ao término, reinicie o sistema. Quando chegar na tela de login, escolha "Plasma" na bolinha branca no canto direito superior à caixa de senha. Antes que eu me esqueça, durante a instalação pode aparecer também uma janela de erro, apenas cancele, ela não voltará a aparecer.

Docker

Recomendo muito que os setups sejam feitos em docker. Se algo der errado, joga-se fora e faz-se outro. Se tudo der certo, faz-se backup. Vamos iniciar então a configuração por aí.

Instalação do Docker

Sem enrolação, vamos ao comandos necessários para instalar a versão mais atualizada do Docker:

sudo su
apt-get update
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
apt-get update
apt-get install docker-ce

Depois de instalado, podemos configurar o sistema para permitir que um usuário comum possa utilizá-lo. Para tal:

groupadd docker #provavelmente já existirá
usermod -aG docker SeuUsuário

Nesse caso específico, você deverá reiniciar o Linux (não se espante).

Criação do container

Agora, vamos baixar a imagem docker do Ubuntu para criarmos nosso container. Para tal:

docker pull ubuntu

Já podemos criar nosso container:

docker run --name opencv -p 9000:9000 -h opencv --privileged --cap-add=ALL -d --device=/dev:/dev -v /home/opencv/opencv:/home/seuUsuario/opencv -v /lib/modules:/lib/modules -t -i ubuntu /bin/bash

Com esse comando, criamos um container chamado opencv e definimos seu hostname como opencv. Isso "tem" que ser feito na criação, depois de criado só é possível renomear o container, não mais o hostname.

Além disso, exportamos o diretório /dev, pois será necessário ter acesso aos recursos da placa de video e o container trabalha com isolamento de processos, por padrão não seria possível utilizar o recurso de video sem esse comando.

Configurações do sistema no container

Quando você executar o comando acima, já estará conectado ao terminal do container. A partir de agora iniciaremos a configuração do sistema. Comece atualizando os repositórios e instalando alguns pacotes necessários:

apt-get update
apt-get install git wget build-essential

Se desejar fazer mais alguma configuração no sistema, aproveite o momento, depois siga para o próximo tópico

Instalar CUDA no Ubuntu (no container)

Depois de instalado, devemos baixar alguns pacotes para a configuração do CUDA. Para esse artigo, utilizei a versão cuda-repo-ubuntu1604_9.1.85-1_amd64.deb . Se não quiser baixar diretamente do link do artigo ou se preferir ver se tem uma versão mais atual, siga esse link.

Será necessário a biblioteca libcudnn também. Essa, somente fazendo um cadastro no site da NVidia, através desse link.

Eu instalei a runtime (cuDNN v7.1.1 Runtime Library for Ubuntu16.04 (Deb)), mas baixei também a dev.

Agora, instale o primeiro pacote (cuda-repo):

dpkg -i cuda-repo*

Após a instalação do pacote será neessário adicionar  a chave do repositório ao sistema (tudo isso no container, não se esqueça).

Seguindo a orientação que aparece ao final da instalação do pacote:

apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub

Atualize seus repositórios mais uma vez e então instale o cuda:

apt-get update
apt-get install cuda

Tem bastante coisa pra baixar. Talvez seja a hora de tomar uma ducha pra relaxar e ver se terminou quando você voltar.

Após, instale o CUDNN:

dpkg -i libcudnn7_7.1.1.5-1+cuda9.1_amd64.deb

Pronto, finalizamos a primeira etapa.

Compilar o OpenCV

Acredite em mim, é mais fácil e mais garantido fazer sua própria compilação, e não apenas pelo fato de que o OpenCV estará customizado para seu hardware, mas tamgém porque o Leonardo Lontra (que escreve código para a mainline do OpenCV) disponibilizou um script mágico que além de fazer a compilação e instalar as dependências, ainda faz cross-compiling e ao final gera o pacote para instalação! Facilitou a vida de todo mundo!

Clonar o github do projeto

Vamos clonar o repositório do projeto OpenCV do Lontra:

git clone https://github.com/lhelontra/build_opencv.git

Depois, entre no diretório criado (build_opencv) e execute:

./build_opencv.sh -c configs/default_cuda.conf --build

Esse script instalará as dependências automaticamente e executará o processo de compilação ao final. Por fim, mostrará o nome do pacote gerado para instalação.  O script automaticamente utiliza todos os núcleos disponíveis no sistema para fazer a compilação, acelerando o processo consideravelmente. Interrompi e executei de novo, ele retoma desde o princípio, validando o que já havia sido compilado. Aqui entra a imagem de destaque desse artigo, como referência.

 

 

Ao término da compilação, essa mensagem será exibida:

opencv_deb.webp

Instale o pacote no container, conforme indicado na mensagem final:

dpkg -i opencv_3.4.1-1_amd64.deb

 

Após esse longo processo, podemos seguir adiante com um teste:

python -c "import cv2"

Não retornou nada? Ok, então está tudo certo, vamos abrir a webcam com o OpenCV. Mas antes, temos que instalar mais dois pacotes:

apt-get install python-pip && pip install --upgrade pip
pip install numpy

Utilize esse código:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    
    #cv2.SaveImage("teste.jpg",frame)

    # Display the resulting frame
    cv2.imwrite('teste.jpg',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Depois de iniciado, interrompa com Ctrl+C e veja imagem teste.jpg no diretório onde o script foi executado. Para copiá-lo para fora do container, use docker cp ou então instale o servidor ssh, lembrando de reconfigurar a porta do servidor em /etc/ssh/sshd_config para 9000.

Bem, ainda resta configurar a dlib e o TensorFlow, mas vou deixar para outro artigo para não ficar muito grande.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.