O presente repositório contém o código que acompanha a postagem do blog? Como construir uma IA conversacional de última geração com aprendizagem por transferência.
Este código é uma base de código limpa e comentada com scripts de treinamento e teste que pode ser usado para treinar um agente de diálogo aproveitando o aprendizado de transferência de um modelo de linguagem OpenAI GPT e GPT-2 Transformer.
Esta base de código pode ser usada para reproduzir os resultados da participação do HuggingFace na competição de diálogo NeurIPS 2018 ConvAI2, que foi o que há de mais moderno em métricas automáticas. As mais de 3k linhas de código de competição foram destiladas em cerca de 250 linhas de código de treinamento com opções distribuídas e FP16 para formar o repositório atual.
Este modelo pode ser treinado em cerca de uma hora em uma instância de nuvem 8 V100 (atualmente custa cerca de US$ 25) e um modelo pré-treinado também é disponibilizado.
Para instalar e usar os scripts de treinamento e inferência, clone o repositório e instale os requisitos:
git clone https://github.com/huggingface/transfer-learning-conv-ai
cd transfer-learning-conv-ai
pip install -r requirements.txt
python -m spacy download en
Para instalar usando o docker, crie a imagem independente:
docker build -t convai .
Observação: certifique-se de que a configuração do Docker aloque memória suficiente para construir o contêiner. A construção com o padrão de 1,75 GB falhará devido à grande roda Pytorch.
Você pode então inserir a imagem
ip-192-168-22-157:transfer-learning-conv-ai loretoparisi$ docker run --rm -it convai bash
root@91e241bb823e:/ # ls
Dockerfile README.md boot dev home lib media models proc root sbin sys train.py utils.py
LICENCE bin convai_evaluation.py etc interact.py lib64 mnt opt requirements.txt run srv tmp usr var
Você pode então executar o script interact.py
no modelo pré-treinado:
python3 interact.py --model models/
Disponibilizamos um modelo pré-treinado e ajustado em nosso S3 aqui. A maneira mais fácil de baixar e usar este modelo é apenas executar o script interact.py
para conversar com o modelo. Sem qualquer argumento, este script irá baixar e armazenar em cache automaticamente nosso modelo.
O script de treinamento pode ser usado em configurações de GPU única ou multi GPU:
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
O script de treinamento aceita vários argumentos para ajustar o treinamento:
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
caminho do conjunto de dados | str | "" | Caminho ou URL do conjunto de dados. Se estiver vazio, baixe do S3. |
conjunto de dados_cache | str | './dataset_cache.bin' | Caminho ou URL do cache do conjunto de dados |
modelo | str | "openai-gpt" | Caminho, URL ou nome abreviado do modelo |
num_candidatos | int | 2 | Número de candidatos para treinamento |
max_history | int | 2 | Número de trocas anteriores para manter no histórico |
train_batch_size | int | 4 | Tamanho do lote para treinamento |
tamanho_de_lote_válido | int | 4 | Tamanho do lote para validação |
gradiente_acumulação_passos | int | 8 | Acumule gradientes em várias etapas |
lr | float | 6.25e-5 | Taxa de aprendizagem |
lm_coef | float | 1.0 | Coeficiente de perda LM |
mc_coef | float | 1.0 | Coeficiente de perda de múltipla escolha |
norma_max | float | 1.0 | Norma de gradiente de recorte |
n_épocas | int | 3 | Número de épocas de treinamento |
personalidade_permutações | int | 1 | Número de permutações de sentenças de personalidade |
dispositivo | str | "cuda" if torch.cuda.is_available() else "cpu" | Dispositivo (cuda ou CPU) |
fp16 | str | "" | Defina como O0, O1, O2 ou O3 para treinamento fp16 (consulte a documentação do apex) |
classificação_local | int | -1 | Classificação local para treinamento distribuído (-1: não distribuído) |
Veja como reproduzir nossos resultados em um servidor com 8 GPUs V100 (adaptar o número de nós e tamanhos de lote à sua configuração):
python -m torch.distributed.launch --nproc_per_node=8 ./train.py --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=2 --n_epochs=1 --num_candidates=4 --personality_permutations=2 --train_batch_size=2 --valid_batch_size=2
Este modelo deve fornecer Hits@1 acima de 79, perplexidade de 20,5 e F1 de 16,5 usando o script de avaliação convai2 (veja abaixo).
Esses números são um pouco inferiores aos que obtivemos na competição ConvAI2. Aqui está o que você pode ajustar para alcançar os mesmos resultados:
O script de treinamento salva todos os experimentos e pontos de verificação em uma subpasta nomeada com o carimbo de data/hora do experimento na pasta ./runs
da pasta base do repositório.
Você pode então usar o script interativo para interagir com o modelo simplesmente apontando para esta pasta.
Aqui está um exemplo de linha de comando para executar o script interativo:
python ./interact.py --model_checkpoint ./data/Apr17_13-31-38_thunder/ # run the interactive script with a training checkpoint
python ./interact.py # run the interactive script with the finetuned model on our S3
O modelo ajustado fornecerá FINAL Hits@1: 0,715
O script interativo aceita alguns argumentos para ajustar o algoritmo de decodificação:
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
caminho do conjunto de dados | str | "" | Caminho ou URL do conjunto de dados. Se estiver vazio, baixe do S3. |
conjunto de dados_cache | str | './dataset_cache.bin' | Caminho ou URL do cache do conjunto de dados |
modelo | str | "openai-gpt" | Caminho, URL ou nome abreviado do modelo |
max_history | int | 2 | Número de declarações anteriores a serem mantidas no histórico |
dispositivo | str | cuda se torch.cuda.is_available() senão cpu | Dispositivo (cuda ou CPU) |
sem_amostra | ação store_true | Definido para usar decodificação gananciosa em vez de amostragem | |
comprimento máximo | int | 20 | Comprimento máximo das declarações de saída |
comprimento_min | int | 1 | Comprimento mínimo das declarações de saída |
semente | int | 42 | Semente |
temperatura | int | 0.7 | Amostragem de temperatura softmax |
top_k | int | 0 | Filtre os k tokens principais antes da amostragem ( <=0 : sem filtragem) |
topo_p | float | 0.9 | Filtragem de núcleo (top-p) antes da amostragem ( <=0.0 : sem filtragem) |
Para executar os scripts de avaliação do desafio ConvAI2, primeiro você precisa instalar ParlAI
na pasta base do repositório assim:
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
Você pode então executar o script de avaliação na pasta base ParlAI
:
cd ParlAI
python ../convai_evaluation.py --eval_type hits@1 # to download and evaluate our fine-tuned model on hits@1 metric
python ../convai_evaluation.py --eval_type hits@1 --model_checkpoint ./data/Apr17_13-31-38_thunder/ # to evaluate a training checkpoint on hits@1 metric
O script de avaliação aceita alguns argumentos para selecionar a métrica de avaliação e ajustar o algoritmo de decodificação:
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
tipo_avaliação | str | "hits@1" | Avalie o modelo na métrica hits@1 , ppl ou f1 no conjunto de dados de validação ConvAI2 |
modelo | str | "openai-gpt" | Caminho, URL ou nome abreviado do modelo |
max_history | int | 2 | Número de declarações anteriores a serem mantidas no histórico |
dispositivo | str | cuda se torch.cuda.is_available() senão cpu | Dispositivo (cuda ou CPU) |
sem_amostra | ação store_true | Definido para usar decodificação gananciosa em vez de amostragem | |
comprimento máximo | int | 20 | Comprimento máximo das declarações de saída |
comprimento_min | int | 1 | Comprimento mínimo das declarações de saída |
semente | int | 42 | Semente |
temperatura | int | 0.7 | Amostragem de temperatura softmax |
topo_k | int | 0 | Filtre os k tokens principais antes da amostragem ( <=0 : sem filtragem) |
topo_p | float | 0.9 | Filtragem de núcleo (top-p) antes da amostragem ( <=0.0 : sem filtragem) |
veja example_entry.py
e o comentário na parte superior.
Se você usar este código em sua pesquisa, poderá citar nosso documento do workshop NeurIPS CAI:
@article{DBLP:journals/corr/abs-1901-08149,
author = {Thomas Wolf and
Victor Sanh and
Julien Chaumond and
Clement Delangue},
title = {TransferTransfo: {A} Transfer Learning Approach for Neural Network
Based Conversational Agents},
journal = {CoRR},
volume = {abs/1901.08149},
year = {2019},
url = {http://arxiv.org/abs/1901.08149},
archivePrefix = {arXiv},
eprint = {1901.08149},
timestamp = {Sat, 02 Feb 2019 16:56:00 +0100},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1901-08149},
bibsource = {dblp computer science bibliography, https://dblp.org}
}