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