현재 저장소에는 블로그 게시물과 함께 제공되는 코드가 포함되어 있습니다. 전이 학습을 통해 최첨단 대화형 AI를 구축하는 방법.
이 코드는 OpenAI GPT 및 GPT-2 Transformer 언어 모델의 전이 학습을 활용하는 대화 에이전트를 훈련하는 데 사용할 수 있는 훈련 및 테스트 스크립트가 포함된 깔끔하고 주석 처리된 코드 베이스입니다.
이 코드베이스는 자동 측정 기준에 있어서 최첨단이었던 NeurIPS 2018 대화 대회 ConvAI2에 HuggingFace가 참가한 결과를 재현하는 데 사용될 수 있습니다. 3k개 이상의 경쟁 코드 라인은 분산 및 FP16 옵션을 사용하여 약 250라인의 훈련 코드로 정제되어 현재 저장소를 형성했습니다.
이 모델은 8개의 V100 클라우드 인스턴스(현재 비용 약 $25)에서 약 1시간 안에 학습할 수 있으며 사전 학습된 모델도 제공됩니다.
교육 및 추론 스크립트를 설치하고 사용하려면 저장소를 복제하고 요구 사항을 설치하십시오.
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
Docker를 사용하여 설치하려면 자체 포함된 이미지를 빌드하세요.
docker build -t convai .
참고: Docker 설정이 컨테이너 구축에 충분한 메모리를 할당하는지 확인하세요. 기본값인 1.75GB로 빌드하면 큰 Pytorch 휠로 인해 실패합니다.
그런 다음 이미지를 입력할 수 있습니다.
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
그런 다음 사전 학습된 모델에서 interact.py
스크립트를 실행할 수 있습니다.
python3 interact.py --model models/
여기에서는 S3에서 사용할 수 있는 사전 훈련되고 미세 조정된 모델을 만듭니다. 이 모델을 다운로드하고 사용하는 가장 쉬운 방법은 interact.py
스크립트를 실행하여 모델과 대화하는 것입니다. 아무런 인수 없이 이 스크립트는 자동으로 모델을 다운로드하고 캐시합니다.
학습 스크립트는 단일 GPU 또는 다중 GPU 설정에서 사용할 수 있습니다.
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
훈련 스크립트는 훈련을 조정하기 위해 여러 인수를 허용합니다.
논쟁 | 유형 | 기본값 | 설명 |
---|---|---|---|
데이터 세트_경로 | str | "" | 데이터세트의 경로 또는 URL입니다. 빈 경우 S3에서 다운로드하세요. |
데이터세트_캐시 | str | './dataset_cache.bin' | 데이터 세트 캐시의 경로 또는 URL |
모델 | str | "openai-gpt" | 모델의 경로, URL 또는 짧은 이름 |
num_candidates | int | 2 | 교육 대상자 수 |
최대_역사 | int | 2 | 기록에 보관할 이전 교환 수 |
train_batch_size | int | 4 | 훈련을 위한 배치 크기 |
유효한_배치_크기 | int | 4 | 검증을 위한 배치 크기 |
그래디언트_축적_단계 | int | 8 | 여러 단계에서 그라데이션을 누적합니다. |
난 | float | 6.25e-5 | 학습률 |
lm_coef | float | 1.0 | LM 손실 계수 |
mc_coef | float | 1.0 | 객관식 손실 계수 |
최대_표준 | float | 1.0 | 클리핑 그래디언트 표준 |
n_epochs | int | 3 | 훈련 에포크 수 |
성격_순열 | int | 1 | 성격 문장의 순열 수 |
장치 | str | "cuda" if torch.cuda.is_available() else "cpu" | 장치(cuda 또는 CPU) |
fp16 | str | "" | fp16 훈련을 위해 O0, O1, O2 또는 O3으로 설정합니다(apex 문서 참조). |
local_rank | int | -1 | 분산 훈련의 로컬 순위(-1: 분산되지 않음) |
8개의 V100 GPU가 있는 서버에서 결과를 재현하는 방법은 다음과 같습니다(노드 수와 배치 크기를 구성에 맞게 조정).
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
이 모델은 conwai2 평가 스크립트(아래 참조)를 사용하여 Hits@1이 79 이상, 혼란도가 20.5, F1이 16.5를 제공해야 합니다.
이 수치는 ConvAI2 대회에서 얻은 수치보다 약간 낮습니다. 동일한 결과를 얻기 위해 조정할 수 있는 사항은 다음과 같습니다.
교육 스크립트는 리포지토리 기본 폴더의 ./runs
폴더에 있는 실험의 타임스탬프로 이름이 지정된 하위 폴더에 모든 실험과 체크포인트를 저장합니다.
그런 다음 대화형 스크립트를 사용하여 이 폴더를 가리키기만 하면 모델과 상호 작용할 수 있습니다.
다음은 대화형 스크립트를 실행하는 명령줄의 예입니다.
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
미세 조정된 모델은 FINAL Hits@1: 0.715를 제공합니다.
대화형 스크립트는 디코딩 알고리즘을 조정하기 위해 몇 가지 인수를 허용합니다.
논쟁 | 유형 | 기본값 | 설명 |
---|---|---|---|
데이터 세트_경로 | str | "" | 데이터세트의 경로 또는 URL입니다. 빈 경우 S3에서 다운로드하세요. |
데이터세트_캐시 | str | './dataset_cache.bin' | 데이터 세트 캐시의 경로 또는 URL |
모델 | str | "openai-gpt" | 모델의 경로, URL 또는 짧은 이름 |
최대_역사 | int | 2 | 기록에 보관할 이전 발화 수 |
장치 | str | cuda if torch.cuda.is_available() else cpu | 장치(cuda 또는 CPU) |
no_sample | 액션 store_true | 샘플링 대신 그리디 디코딩을 사용하도록 설정 | |
최대 길이 | int | 20 | 출력 발언의 최대 길이 |
최소 길이 | int | 1 | 출력 발언의 최소 길이 |
씨앗 | int | 42 | 씨앗 |
온도 | int | 0.7 | 샘플링 소프트맥스 온도 |
top_k | int | 0 | 샘플링 전 상위 k 토큰 필터링( <=0 : 필터링 없음) |
top_p | float | 0.9 | 샘플링 전 핵 필터링(top-p)( <=0.0 : 필터링 없음) |
ConvAI2 챌린지의 평가 스크립트를 실행하려면 먼저 다음과 같이 repo 기본 폴더에 ParlAI
설치해야 합니다.
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
그런 다음 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
평가 스크립트는 평가 지표를 선택하고 디코딩 알고리즘을 조정하기 위해 몇 가지 인수를 허용합니다.
논쟁 | 유형 | 기본값 | 설명 |
---|---|---|---|
평가_유형 | str | "hits@1" | ConvAI2 검증 데이터세트의 hits@1 , ppl 또는 f1 지표에 대한 모델을 평가합니다. |
모델 | str | "openai-gpt" | 모델의 경로, URL 또는 짧은 이름 |
최대_역사 | int | 2 | 기록에 보관할 이전 발화 수 |
장치 | str | cuda if torch.cuda.is_available() else cpu | 장치(cuda 또는 CPU) |
no_sample | 액션 store_true | 샘플링 대신 그리디 디코딩을 사용하도록 설정 | |
최대 길이 | int | 20 | 출력 발언의 최대 길이 |
최소 길이 | int | 1 | 출력 발언의 최소 길이 |
씨앗 | int | 42 | 씨앗 |
온도 | int | 0.7 | 샘플링 소프트맥스 온도 |
top_k | int | 0 | 샘플링 전 상위 k 토큰 필터링( <=0 : 필터링 없음) |
top_p | float | 0.9 | 샘플링 전 핵 필터링(top-p)( <=0.0 : 필터링 없음) |
example_entry.py
와 상단의 설명을 참조하세요.
연구에 이 코드를 사용하는 경우 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}
}