使用预训练的XLNet
实现神经对话生成器模型Yang 等人。 (2019)和GPT2
架构Radford 等人。 (2019)当前三个数据集: DailyDialog
Li 等人。 (2017) , PersonaChat
张等人。 (2018)和新的TopicalChat
Gopalakrishnan 等人。 (2019)来自 Alexa 奖社交机器人大挑战 3。Top-k 采样Fan 等人。 (2018)和核解码Holtzman 等人。 (2019)可用作解码技术。训练目标是对话语和对话历史进行自回归语言建模。
该模型可以利用 nvidia/apex 的混合精度训练。请注意,apex 不是必需的,仅在可用时才使用。安装指南请参阅官方说明。使用此模块并不适用于所有 GPU(仅 Volta 和 Turing),您应该事先检查您的实例是否支持混合精度训练。
要训练模型,请克隆此存储库并安装依赖项。该项目使用 cython 来组装批次以加快输入管道的速度。它还更喜欢使用 python virtualenv。
git clone https://github.com/bme-chatbots/dialogue-generation.git
cd dialogue-generation
pip install -r requirements.txt
python setup.py build_ext --inplace
以下命令将开始在PersonaChat
上使用gpt2-medium
模型在单个 GPU/CPU 上进行训练。 --name
是模型文件夹中保存日志和检查点的子目录的名称。
python -m src.train --model gpt2-medium --data personachat --name my_test_run
对于分布式多 GPU 训练,训练脚本应该这样调用。
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS src/train.py --model gpt2
您还可以通过将配置 json 文件的路径作为--config
参数传递来使用预定义的配置。这些可以在src/configs
文件夹中找到,它们的训练结果可以在结果部分下面看到。
python -m src.train --config src/configs/xlnet-dailydialog.json
在Google Colaboratory或Kaggle 内核上训练模型既快速又简单。使用新的 Tesla P100 或 Tesla T4 单元将运行时类型设置为 GPU 非常重要,因为它可以充分利用混合精度训练,并且比旧的 Tesla K80 版本快得多。您可以通过在 Colab 的单元中运行!nvidia-smi
来检查当前类型。
作为一个快捷方式,这里有一个完整的示例要点,您可以将其作为协作文件导入到您的 Google 云端硬盘中。
在 colab (或 Kaggle 内核)文件的单元格中复制并运行以下代码以安装模型。如果您使用 Kaggle 内核,您还必须启用互联网访问。
! git clone https://github.com/bme-chatbots/dialogue-generation.git
! python -m pip install --upgrade pip
# installing apex is optional and is only useful if Colab's Tesla P100 or T4 is used
# !git clone https://github.com/NVIDIA/apex
# !cd apex; pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" .
# building the cython code and installing the required packages
! cd dialogue-generation ; pip install -r requirements.txt ; python setup.py build_ext --inplace
训练和验证指标会记录到 Tensorboard,如果在训练单元之前运行以下代码,也可以在 colab 文件中进行跟踪。
%load_ext tensorboard
%tensorboard --logdir " dialogue-generation/model "
然后只需使用默认标志运行train
脚本即可训练模型。您可以通过提供-h
标志来查看train.py
脚本接受的所有标志。
! cd dialogue-generation ; python -m src.train
训练后,可以通过将以下代码片段中的下载链接设置为评估后脚本记录的链接来下载模型。 ( Saving model to dialogue-generation/src/../model/gpt2/19.11.03-12:59:47/model.pt
)
from IPython . display import FileLink
# note that in case of kaggle kernel you have to give path
# relative to your working directory
FileLink ( r'dialogue-generation/src/../model/gpt2/19.11.03-12:59:47/model.pt' )
通过运行interact
脚本并使用--model_file
提供训练模型的路径,可以在训练模型上使用交互式评估模式。您还可以提供--config
文件,或者只是简单地提供训练期间使用的相同--model
和--name
参数。
python -m src.interact --model gpt2-medium --name my_test_run
python -m src.interact --config src/configs/xlnet-dailydialog.json
要在您自己的数据集上训练任何模型,您只需从DialogDataset
进行子类化并从原始文件实现数据生成即可。给定一个放在data<name of your data>
中的train.txt
、 valid.txt
和test.txt
,其中对话框中的每个回合都在一个新行中,并且单独的对话框由额外的空行分隔。
├── data
| ├── dailydialog
| └── custom_dataset # name of your data ( custom_dataset by default )
| ├── train.txt # the correctly formated train, valid and test files
| ├── valid.txt
| └── test.txt
├── src
Hello how are you?
Hi I'm fine thanks. And you?
Me too thanks for asking.
Hi my name Peter.
Nice to meet you I am Eric.
data.py
中实现了一个名为CustomDataset
的示例自定义数据集类,它读取具有这些属性的数据集。
下面的对话框是从gpt2
采样的,在PersonaChat
数据集上使用默认参数训练了 7 个 epoch(149051 步骤)和--max_hist 3
。
User: hi
Bot: greetings, i'm gerald.
User: how are you ?
Bot: good, thanks. getting ready for another hike, i love hiking!
User: oh realy? where are you going?
Bot: pikes peak. i am curently exploring famous mountains when i have time.
User: that is cool are you going alone?
Bot: my brother is in the us, we go hiking with him every month.
User: how old are you by the way?
Bot: a little under 46 years old
User: are you in a relationship?
Bot: yes i am married, 3 boys, i am pregnant again. i am too busy to focus
下面的对话框是从gpt2
采样的,在DailyDialog
数据集上使用默认参数训练了 8 个时期(48824 个步骤)和--max_hist 3
。
User: hi how are you ?
Bot: fine. i got a promotion at work earlier this week.
User: where do you work ?
Bot: I work at the polling place.
User: where is that ?
Bot: I live in the dorms across the street.
User: do you like it ?
Bot: it's great. I heard it is far from here.
User: are you a student ?
Bot: yes. I am a student too.