quarta-feira, 12 de maio de 2021

Setup do Spyder

 O Spyder é um dataset para avaliação de parsers de linguagem natural para SQL o site oficial é:

https://yale-lily.github.io/spider

Para você conseguir realizar avaliação localmente é necessário realizar um setup que originalmente está em:

https://github.com/taoyds/test-suite-sql-eval

A sequência de passos que vou relatar aqui visam a ajudar pessoas que queiram montar este ambiente e tiveram alguma problema com as intruçãoes originais, que são muito boas. Acredito que acrescentei passos que podem ajudar quem está começando a montar ambientes como este.


 

Environment preparation:

Escolha onde <alguma coisa> irá montar a estrutua de diretórios para o parsers e:

mkdir nl2sql

cd nl2sql

mkdir spider-eval

cd spider-eval

git clone https://github.com/taoyds/test-suite-sql-eval

 

 

Environment prepare

conda create --name spider-eval python=3.7

conda activate spider-eval                            

conda install pytorch=1.5 cudatoolkit=10.2 -c pytorch

  

Download the dataset

cd <alguma coisa>/nl2sql/spider-eval/test-suite-sql-eval

pip install gdown

gdown --id 1mkCx2GOFIqNesD4y8TDAO1yX1QZORP5w

unzip testsuitedatabases.zip

rm -r __MACOSX                                          <  retira diretório que não vai ser usado

rm testsuitedatabases.zip            <  retira arquivo grande que não vai ser mais usado

 

Install sqlparse and nltk to run the evaluation:
 

pip3 install sqlparse

pip3 install nltk

conda install jupyter notebook                                                       < eu que inclui

conda install -c conda-forge jupyter_contrib_nbextensions    < eu que inclui

 

Test

python3 evaluation.py --gold=evaluation_examples/gold.txt --pred=evaluation_examples/predict.txt --db=database --etype exec --plug_value


 

arguments:

     [gold file]       gold file where each line is `a gold SQL \t db_id` for Spider, SParC, and CoSQL, and interactions are seperated by one empty line for SParC and CoSQL. See an example at evaluation_examples/gold.txt

    [predicted file]   predicted sql file where each line is a predicted SQL, and interactions are seperated by one empty line. See an example at evaluation_examples/predict.txt

    [database dir]     the directory that contains all the databases and test suites

    [table file]       table.json file which includes foreign key info of each database.

    [evaluation type]  "exec" for test suite accuracy (default), "match" for the original exact set match accuracy, and "all" for both

    --plug_value       whether to plug in the gold value into the predicted query; suitable if your model does not predict values.

    --keep_distinct    whether to keep distinct keyword during evaluation. default is false.

    --progress_bar_for_each_datapoint   whether to print progress bar of running test inputs for each datapoint

Setup do RAT-SQL+GAP

 O RAT-SQL+GAP é um parser de linguagem natural para SQL, as excelentes instruções de instação estão aqui:

GAP-text2SQL: Learning Contextual Representations for Semantic Parsing with Generation-Augmented Pre-Training

A sequência de passos que vou relatar aqui visam a ajudar pessoas que queiram montar este ambiente e tiveram alguma problema com as intruçãoes originais, que são muito boas. Acredito que acrescentei passos que podem ajudar quem está começando a montar ambientes como este.


Environment preparation:

conda create --name gap-text2sql python=3.7

conda activate gap-text2sql                            

conda install pytorch=1.5 cudatoolkit=10.2 -c pytorch

conda install jupyter notebook                                                     < eu que inclui

conda install -c conda-forge jupyter_contrib_nbextensions < eu que inclui



Escolha onde <alguma coisa> irá montar a estrutua de diretórios para o parsers e:

mkdir nl2sql

cd nl2sql

 

git clone https://github.com/awslabs/gap-text2sql  < não estava na instrução

cd gap-text2sql/rat-sql-gap          < os comandos são executados a partir desse diretório

 pip install -r requirements.txt        < requirements.txt está no diretório gap-text2sql/rat-sql-gap

pip install attr                                 < não estava na instrução

pip install attrs                                < não estava na instrução

pip install asdl      < não estava na instrução, descobri a falta  no passo: Preprocess dataset

pip install astor    < não estava na instrução, descobri a falta  no passo: Preprocess dataset

python -c "import nltk; nltk.download('stopwords'); nltk.download('punkt')"

pip install pudb       < não estava na instrução, é um debuger

 

Download the dataset

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

pip install gdown

gdown --id 1_AckYkinAnhqmRQtGsQgUKAnTHxxX5J0

unzip spider.zip                                  <  é criado um diretório spider dentro de rat-sql-gap

bash data/spider/generate.sh ./spider     < existe um diretório spider dentro de data

rm spider.zip                                 <  deletando o arquivo que é grande 


Build dataset directory

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

mkdir data/spider-bart

cp ./spider/tables.json data/spider-bart/              <  copy file

cp ./spider/train_spider.json data/spider-bart/

cp ./spider/train_others.json data/spider-bart/

cp ./spider/dev.json data/spider-bart/

ln -s $(pwd)/spider/database data/spider-bart/database    < create symbolic link

 

 

Download the library

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

mkdir third_party

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.zip

unzip stanford-corenlp-full-2018-10-05.zip -d third_party/

rm stanford-corenlp-full-2018-10-05.zip           <  deletando o arquivo que é grande 



Start the Stanford library

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

sudo apt install openjdk-11-jre-headless

 

pushd third_party/stanford-corenlp-full-2018-10-05            

nohup java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 8999 -timeout 15000 > server.log &

popd

 

Download the checkpoint

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

mkdir ie_dirs

mkdir -p logdir/bart_run_1/bs\=12\,lr\=1.0e-04\,bert_lr\=1.0e-05\,end_lr\=0e0\,att\=1/

curl https://gap-text2sql-public.s3.amazonaws.com/checkpoint-artifacts/gap-finetuned-checkpoint -o logdir/bart_run_1/bs\=12\,lr\=1.0e-04\,bert_lr\=1.0e-05\,end_lr\=0e0\,att\=1/model_checkpoint-00041000

 

mkdir -p pretrained_checkpoint

curl https://gap-text2sql-public.s3.amazonaws.com/checkpoint-artifacts/pretrained-checkpoint -o pretrained_checkpoint/pytorch_model.bin


Setup spaCy em Português 

Como faço testes com perguntas em português, eu instalo o spaCy, pois o lemmatizer padrão do RAT-SQL-GAP Stanford coreNLP não trata português

Existem um seletor de versões no site: https://spacy.io/usage

Eu usei este setup com foi gerado com as opções: Linux/conda/GPU/portuguese/efficiency

conda install -c conda-forge spacy

conda install -c conda-forge cupy

python -m spacy download pt_core_news_sm


A partir desse ponto o ambiente está pronto, as próximas etapas se referem ao uso do RAT-SQL-GAP

Arquivos de entrada

Os arquivo de entrada do Spider que estão no diretório:

<alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap/data/spider-bart/

tables.json , train_spider.json, train_others.json,  dev.json

Os arquivos train_spider.json, train_others.json, dev.json contém as perguntas em linguagem natural que ser relacionam com a query SQL.  Os dois primeiros que tem train_ são usados para o treinamento e dev.json é usado no EVAL, que é uma inferência local para saber a eficiência do modelo treinado. O arquivo contém as tables dos bancos de dados.

Configurações

O arquivo <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap/experiments/spider-configs/gap-run.jsonnet

Contém as configurações necessárias para as três etapas no uso do RAT-SQL-GAP:

  • Preprocess
  • Train
  • Eval



Preprocess dataset

Esta é uma etapa de preparação para o treinamento.

cd <alguma coisa>/nl2sql/gap-text2sql/rat-sql-gap

python run.py preprocess experiments/spider-configs/gap-run.jsonnet

Esta é uma execução um pouco demorada, serão grados os aquivos, para o encoder e decoder que serão usados no treinamento:

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/observed_productions.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/dec/val.jsonl

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/dec/train.jsonl

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/grammar_rules.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/vocab.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/merges.txt

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/tokenizer_config.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/special_tokens_map.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/val.jsonl

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/added_tokens.json

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/enc/train.jsonl

./rat-sql-gap/data/spider-bart/nl2code-1115,output_from=true,fs=2,emb=bart,cvlink/dec_vocab.json

O próximo passo natural seria o treinamento, mas nós já fizemos o download do modelo treinado:

/gap-text2sql/rat-sql-gap/pretrained_checkpoint/pytorch_model.bin

e do checkpoint:

/gap-text2sql/rat-sql-gap/logdir/bart_run_1/bs\=12\,lr\=1.0e-04\,bert_lr\=1.0e-05\,end_lr\=0e0\,att\=1/model_checkpoint-00041000


Inference

cd /mnt/Files/nl2sql/gap-text2sql/rat-sql-gap

python run.py eval experiments/spider-configs/gap-run.jsonnet

 

resultados:

cd ie_dirs/

(gap-text2sql) marchanjo@ciaamS03:/mnt/Files/nl2sql/gap-text2sql/rat-sql-gap/ie_dirs$ ls

bart_run_1_true_1-step41000.eval  bart_run_1_true_1-step41000.infer

 

Training

cd /mnt/Files/nl2sql/gap-text2sql/rat-sql-gap

python run.py train experiments/spider-configs/gap-run.jsonnet


sexta-feira, 19 de fevereiro de 2021

Ambiente individual num computador para processamento de Deep Learning

 

Aqui estão algumas instruções que consideram um computador para processamento de Deep Learning, que eu vou chamar de servidor remoto.

Esta é uma instrução para separação básica de ambientes, pois todos ainda vão depender da mesma versão do CUDA.

1- Conta de usuário

Crie uma conta para cada usuário o servidor e adicione ao grupo sudo, instruções completas aqui.

sudo adduser <nome do usuário>

sudo usermod -aG sudo <nome do usuário>

Efetue pelo menos um login na tela de entrada do Ubuntu com esta conta para criar o Home Directory


2- Instale o Miniconda e seu ambiente

Cada usuário, usando sua própria conta, deve instalar no servidor o Miniconda e seu ambiente de desenvolvimento, mais instruções aqui.

Faça o download do Miniconda

Para fazer o download por linha de comando no shell, primeiro obtenha o caminho completo do arquivo de instalação do Miniconda que você deseja, depois execute ao comando;

considerando que o shell esta em sua home e existe um diretório Downloads

curl <caminho completo> -o Downloads/<nome do arquivo>

exemplo

curl https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh -o Downloads/Miniconda3-py39_4.9.2-Linux-x86_64.sh


cd Downloads

Permida a execução do arquivo que você fez o download

chmod 700 <nome do arquivo>

execute:
./<nome do arquivo>

Se você sá sabe como quer criar um ambiente, crie este ambiente e instale o que achar necessário

conda create -n <nome do ambiente>

Obs1.: Para listar ambientes existentes use: conda env list
Obs2.: Para remover um ambiente use: conda env remove --name <nome>

3- Dica: Mapeando um diretório com o SSHSF

Mais instruções aqui.


Para conectar a partir de um desktop local  com Linux:

crie um diretório para montar:
sudo mkdir /mnt/droplet

conecte como sshsf no diretório corresondente:
sudo sshfs -o allow_other,default_permissions <usuário>@<IP servidor remoto>:/ /mnt/droplet

Depois de usar, para desmontar execute:
sudo umount /mnt/droplet
sudo rmdir /mnt/droplet


Para conectar a partir de um desktop local com Windows 10:
Instale a versão estável do SSHFS-Win · SSHFS for Windows, no meu caso foi a 3.5.20357
Instale a versão estável do WinFsp · Windows File System Proxy, no meu caso foi a 1.8

No File Explorer (Explorador de Arquivos)
botão direito em Rede
Mapear unidade de rede
Para o root:
          \\sshfs\<usuário>@<IP servidor remoto>/../..
usando porta diferente:
     \\sshfs\<usuário>@<IP servidor remoto>!<porta>/../..
Ou

Para o home:
            \\sshfs\<usuário>@<IP servidor remoto>
usando porta diferente:
     \\sshfs\<usuário>@<IP servidor remoto>!<porta>

Mais opções aqui.

4- Dica: Acessando Jupyter Notebook remotamente

Informações mais detalhadas aqui.

Depois que seu ambiente de desenvolvimento estiver pronto no servidor remoto e você deseja acessar o Jupyter Notebook no navegador seu desktop local.

No desktop local em um sheel à parte execute um redirecionamento de portas:
ssh -N -f -L localhost:8889:localhost:8888 <usuário>@<IP servidor remoto>
    Obs: Este redirecionamento precisa ser feito novamente ser você reinicialr o desktop local.

No servidor remoto, (via ssh) :

Vá para o root se quiser acessar diretórios como /mnt (onde são montados outros discos):
cd /

Entre no ambiente correspondente:

conda activate <nome> 

e inicie o jupyter notebook:

jupyter notebook --no-browser

No navegador do desktop local chame o link que foi gerado, modificando a porta para 8889, o formato é pareceido com este, o token será outro.

http://localhost:8889/?token=<aqui vem uma sequência alfa numércia>

Obs.1: Configurei dessa forma para que fique a porta padrão 8888/tcp para os Jupyter Notebooks que estão executando no seu desktop local e a porta 8889/tcp para os Jupyter Notebooks que estão executando no servidor remoto.

Obs.2: Estando no raíz você pode acessar via Jupyter Notebook tanto HDs que estejam montados no /mnt ou acessar sua home em /home/<nome do usuário> 

5- Dica: Para seções que vão demorar muito

O Screen é uma aplicação de console que permite retomar uma seção que foi perdida, entre outras funções. Mais informações aqui.

Depois de conectar com o SSH execute, screen -S <palavra> e depois use screen -dr <palavra> para retomar a seção, exemplo:

screen -S hello

Execute os camandos que precisa, para testar feche a janela que está usando o SSH, conecte novamente e execute 

screen -dr hello

Assim você retoma o terminal que estava aberto. Em caso de execuções muito demoradas poder retomar a seção é fundamental.


Obs1.: Para sair do screen use: exit
Obs2.: Para visualizar as screens existentes use: screen -ls
Obs3.: Para terminar uma screen detached use: screen -X -S <numero.nome> quit


6- Dica: Monitorar GPUs

Simplesmente execute em um sheel remoto adicional :
nvidia-smi

Ou, crie um Jupyter Notebook e inclua a linha:
!nvidia-smi

Para ambos os casos o resultado será uma tela como esta:
Thu Mar 18 12:53:55 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 3090    Off  | 00000000:04:00.0 Off |                  N/A |
| 30%   33C    P8    11W / 350W |      5MiB / 24268MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 3090    Off  | 00000000:09:00.0 Off |                  N/A |
| 30%   33C    P8    12W / 350W |     72MiB / 24259MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1260      G   /usr/lib/xorg/Xorg                  4MiB |
|    1   N/A  N/A      1260      G   /usr/lib/xorg/Xorg                 56MiB |
|    1   N/A  N/A      1445      G   /usr/bin/gnome-shell               13MiB |
+-----------------------------------------------------------------------------+


Se quiser acompanhar passo-a-passo, abra um sheel remoto adicional e execute:

nvidia-smi --query-gpu=timestamp,name,pci.bus_id,pstate,temperature.gpu,utilization.gpu,utilization.memory --format=csv -l 20


Será apresentado:
Data
Nome da GPU
Id do PCI Bus (serve para você identificar mais de uma GPU)
Temperatura
% de utilização da GPU
% de utilização da memória da 
GPU

Mais informações e opções aqui.

Obs.: O último número do comando representa os segundos de atulização, dos jeito que está indica 20 segundos. Para execuções longas basta você pode usar 60 segundos (1 minuto) ou 3600 (1 hora).

outra alternativa:

pip install GPUtil

e

python -c "from GPUtil import showUtilization as gpu_usage; gpu_usage()"



7- Dica: Checando versões

No shell execute:

Python
python --version

Pytorch
python -c "import torch; print(torch.__version__)"

ou

pip freeze | grep torch


Cuda e Driver 
nvidia-smi


Transformers
python -c "import transformers; print(transformers.__version__)"

ou 

pip freeze | grep transformers

Dica sobre transformers:
Pode ocorrer conflito entre versões e o tipo de instalação, por exemplo nas duas formas acima aparencem versões diferentes, nete caso recomendo, desinstalar e instalar novamente:

conda uninstall -c huggingface transformers
pip uninstall transformers
pip install transformers

Jsonnet
pip freeze | grep _jsonnet

8-Dica: Limpeza do disco


Limpando a lixeira:
rm -rf ~/.local/share/Trash/*

Limpando cache do Huggingface:
rm -rf ~/.cache/huggingface/transformers/*
rm -rf ~/.cache/huggingface/hub/*

9-Dica: Jupyter Notebook 500 : Internal Server Error

conda uninstall nbconvert
pip uninstall nbconvert
conda install nbconvert==5.6.1 

Caso dê erro para abrir o Jupyter notebook reinstale usando conda:

conda install jupyter notebook

Para ver os caminhos do Jupyter:
jupyter --paths

Para ver a versão:
jupyter --version
pip freeze | grep nbconvert

Mais informações aqui.

terça-feira, 16 de fevereiro de 2021

Preparando um computador para processamento de Deep Learning

 Este post visa a descrever alguns passos básicos para disponibilizar um computador para processamento de modelos de aprendizado profundo (deep learning) que pode ser acessado remotamente por uma equipe que trabalha com Inteligência Artificial.

Este post é inspirado em: How to build a deep learning server based on Docker

Não vou tratar aspectos de hardware.

Vamos ao passo-a-passso.

1- Sistema operacional Linux

Irei usar o Ubuntu 20.04LTS desktop. Recomendo fortemente a versão que for LTS (Long-Term Support), pois isso irá garantir suporte por mais tempo. 

Obs.: Usar a versão server exige mais esforço administrativo, eu recomendo que seja usada quando você já sabe antecipadamente os usos do equipamento caso envolva pesquisa ou uso exploratório de deep learning a versão desktop facilita um pouco a vida.


2- Ativar Firewall

É altamente recomendavel ativar o Firewall UFW 

Primeiro vamos deixar permitr o acesso remoto via SSH:

sudo ufw allow ssh

Agora vamos deixar permitr o acesso remoto via NoMachine (mais informações abaixo):

sudo ufw allow 4000/tcp

sudo ufw allow 4443/tcp

Para ativar use:

sudo ufw enable

Dica:

Caso precise desabilitar o Firewall durante algum debug use: sudo ufw disable

Para saber o estatus  do Firewall use: sudo ufw status verbose

Para negar acesso use deny no lugar de allow.

3- Acesso Remoto SSH

Um equipamento com esta finalidade que vai ser acessado por uma equipe precisa ser acessado remotamente e a forma mais básica é com o shell e com segurança, para isso instale o Secure Shell (SSH):

sudo apt update

sudo apt install openssh-server

Instale também o sshfs, que permite a transferência de arquivos. Mais instruções aqui.

sudo apt-get install sshfs

Teste: em um outro computador Linux (funciona também a partir do Windows 10 command prompt ou PowerShell) use:

ssh username@ip_address


4- Instale o Screen

O Screen é uma aplicação de console que permite retomar uma seção que foi perdida, entre outras funções. Mais informações aqui.

sudo apt-get update

sudo apt-get install screen

5- Acesso Remoto Gráfico

Pela interface gráfica:

Download o NoMachine para Linux eu usei o NoMachine para Linux DEB amd64

Instale o NoMachine, com duplo clique sobre o arquivo, no meu caso o arquivo que baixei foi:

nomachine_7.1.3_1_amd64.deb

E clique em install.

Também instale no computador que você vai usar para acessar o equipamento de deep learning.


OU

Por linha de comando

https://www.nomachine.com/pt-pt/download/download&id=1

Download o NoMachine para Linux eu usei o NoMachine para Linux DEB amd64

e copiei na máquina (usando o sshfs), no meu caso eu baixei: 

nomachine_7.8.2_1_i686.tar.gz


sudo cp -p nomachine_7.8.2_1_i686.tar.gz /usr

cd /usr

sudo tar zxf nomachine_7.8.2_1_i686.tar.gz

sudo /usr/NX/nxserver --install


Mais informaçoes .: Install, update e uninstall via linha de comando no Ubuntu: 2.6. DEB Packages  


5- Duck DNS

Acesse DuckDNS efetue o login e crie um nome para o domínio.

Para instalar siga as intruções:

ps -ef | grep cr[o]n

crie um diretório duckdns:

cd /etc

sudo mkdir duckdns

sudo chmod 777 duckdns

Entre no diretório:

cd duckdns

Instale o curl:

sudo apt install curl

Crie um arquivo duck.sh no diretório duckdns incluindo o seguinte conteúdo, trocando o domain e o token pelos que você criou:

echo url="https://www.duckdns.org/update?domains=exampledomain&token=a7c4d0ad-114e-40ef-ba1d-d217904a50f2&ip=" | curl -k -o /etc/duckdns/duck.log -K -



Mude a permissão do arquivo para que ele possa ser executado

sudo chmod 777 duck.sh

Programe o cron para que o arquivo duck.sh seja executado a cada 5 min

crontab -e

Selecione o editor nano

copie o seguinte texto no final do arquivo:

*/5 * * * * /etc/duckdns/duck.sh >/dev/null 2>&1

pressione:

CRTL + o  para salvar

CRTL + x para sair


Para testar use o comando:

./duck.sh

Veja se o conteúdo do log é OK (quer dizer que funcionou) se for KO reveja o token e o dominio se estão corretos no arquivo duck.sh

cat duck.log

Estando OK, delete o arquivo duck.log e veja se ele é gerado novamente depois de 5 minutos, examine o conteúdo se é OK.

Neste ponto pode ser necessário fazer um redirecionamento de porta para que seja possível acessar um computador da rede interna com uma conexão da internet.


6- Instalando NVIDIA driver

Instruções aqui: guia de instalação.

Driver:

Faça o download do driver na própria máquina, pois ele detecta automaticamente.

O arquivo tem a exetensão NVIDIA-Linux-<alguma coisa>.run

chmod 700 NVIDIA-Linux-<alguma coisa>.run

sudo ./NVIDIA-Linux-<alguma coisa>.run


Para instalação do CUDA siga as instruções daqui.


7- Adicione Hard Disks

É comum em equipamentos como este ter HDs adicionais, aqui segue uma intrução básica para adiciona-los:

No Ubunto use o Disks que está em Aplications
Selecione o HD novo e format como Ext4
anote o caminho /dev/sd?

Crie o diretório:
sudo mkdir /mnt/<nome>

Para montar o HD de maneira permante é preciso adicionar linhas no  fstab, mas antes precisamos decobri o UUID correspondente ao HD  que se refere ao /dev/sd?, o blkid vai mostrar
uma linha equivalente a esta:
/dev/sd?: LABEL="files" UUID="<valor alfa numérico>" TYPE="ext4"

o valor alfa númerico tem este formato: 3dc00cf1-4663-45d2-a9c7-672e15335431

sudo blkid


sudo nano /etc/fstab
adicione no final uma linha como esta abaixo. Cuidado! Use o conteúdo do UUID que você obteve pelo blkid sem as "aspas" e indique o diretório que você criou em /mnt/<nome>, use CRTL+O para savar e CRTL+X para sair.

UUID=3dc00cf1-4663-45d2-a9c7-672e15335431 /mnt/<nome>      ext4    defaults        0       0


Permita o acesso, aqui é dado acesso total:
sudo chmod 777 /mnt/<nome>

8- Mudando nome do computador

É comum que o equipamento tenha um nome padronizado, para mudar o nome edite /etc/hostname e /etc/hosts

sudo nano /etc/hostname

use CRTL+O para savar e CRTL+X para sair.


sudo nano /etc/hosts

use CRTL+O para savar e CRTL+X para sair.

Para o novo nome valer é necessário reiniciar o computador:

sudo reboot


9- Mudando nome do usuário root

É comum que o usuário root tenha um nome e senha padronizados.

Com o usuário root mude a senha:

sudo passwd <nome atual>

Para mudar o nome do usuário root crie um outra conta que pretença o grupo sudo (veja o item 11- Crei as contas para cada usuário). Efetue o login com esta outra conta e execute, substituindo os campos marcados pelo nome novo e o nome atual


sudo usermod -l <nome novo> -d /home/<nome novo> -m <nome atual>

sudo reboot

O nome novo já está funcionando para uma conexão ssh, mas na tela inicial gráfica do Ubunto ainda não mudou.

Efetue o login com a conta nova (o nome atual ainda aparece) através da tela inicial gráfica do Ubuntu 

Em Settings / Users  troque o nome atual pelo novo.


10- Configure máquina para ligar automaticamente quando tiver queda de energia


A configuração na BIOS varia de fabricante para fabricante, mais informações aqui.

No meu caso a configuração foi a seguinte:
  1. Ligue a máquina e pressione Delete ou F2 - Entra configuração da BIOS
  2. F7 para entrar em Advanded Mode
  3. APM Configuration
  4. Restore AC Power Loss -> Last State  
Você pode escolher Power On, neste caso sempre que volta a energia a máquina liga sozinha, mesmo se ela estiver intensionamente desligada. O Last State é mais completo, a se a máquina estava ligada quando a energia volta ela liga sozinha e se estava desligada continua desligada.

Nota1: Isso tem a função de evitar um deslocamento para simplesmente ligar a máquina no caso de queda de energia.
Nota2: Para que a máquina continue operando em caso de queda de energia, você deve tem um NoBreak, mas lembre-se que ele suporta a máquina por pouco tempo. Em soluções profissionais usa-se NoBreaks e também Geradores. O NoBreak serve de segurança enquanto o Gerador entra em operação e estabiliza. Soluções completas assim exigem manutenção, testes periódios e garantir que o Gerador tenha seu combustível.

11- Crie as contas para cada usuário