本文介绍如何通过困惑度PPL和准确度ACC这两个指标来量化Lambada数据集对模型的评估效能,从而对模型的理解能力进行量化打分。
目前的模型在回答一些简单、通用的问题时表现尚佳,但是一旦涉及到需要依托上下文进行深入理解的问题时,就会表现得颇为逊色。例如,有些模型只能处理短文本,无法处理长文本;有些模型只能处理单句,不能处理多句;有些模型只能处理简单的问题,不能处理复杂的问题等等。因此,为了评估模型对长文本处理的精度,研究人员构造了一个唯有通过上下文方可准确作答的数据集——Lambada。Lambada是一组叙述性段落,具有这样一个特点:如果人类处于整个段落的情境之中,他们能够推测出其最后的单词,但如果他们仅目睹目标单词之前的最后一句话,他们则无法做出猜测。要在Lambada上成功,计算模型不能仅仅依赖于局部语境,还必须能够跟踪更广阔的语篇中的信息。
语料来源
Lambada所构建的语料库源自尚未发表的文集,涵盖5325篇文章的4.65亿个单词,旨在最大程度地降低通用知识对答案产生的影响,致使模型难以凭借通用知识推导出答案。此外,语料中每篇文章的两两交集较少,因而模型很难依据一篇文章的背景知识推导另一篇文章的答案,进一步削减了通用知识所带来的影响。
数据筛选过程
评估分为三个步骤:对于给定的段落(如下图所示),首先由第一个专业评估人员基于整个段落(包括Context和Target sentence)猜测目标词,如果猜测正确,继而由第二个评估人员同样基于整个段落猜测目标词,如果也能够正确猜出目标词,接着邀请更多的评估者去根据Target sentence猜测目标词,直到有人猜中目标词或者不成功的猜测次数达到10次为止。如果没有人能够猜中目标词,该段落将被添加到Lambada数据集中。
为了量化Lambada数据集对模型的评估效能,这里采用困惑度PPL和准确度ACC来对模型的理解能力进行量化打分。
PPL
在自然语言处理(Natural Language Processing,NLP)中,PPL(Perplexity的缩写)是一种用于评估语言模型质量的度量指标。语言模型是一种用来预测下一个单词或一组单词的概率分布的统计模型。PPL用于衡量语言模型在给定一段文本之后,对下一个单词进行预测的困惑程度。在实践中,PPL值越低意味着模型更好地预测了测试数据集中的单词序列,而更高的PPL值则表示模型的预测能力较差。因此PPL常被用作比较和评估不同语言模型的性能。
ACC
表示正确预测的样本数占总体样本数的比例,即ACC = Right / All。
下载本文所需软件需要访问国外网站,建议您增加网络代理(例如FlexGW)以提高访问速度。您也可以将所需软件下载到本地,参考本地数据上传到GPU实例中。
nvidia-smi
/usr/local/cuda/bin/nvcc -V
执行以下命令,通过官方的便捷脚本安装Docker。
curl https://get.docker.com | sh \ && sudo systemctl --now enable docker
安装nvidia-docker2。
执行以下命令,配置apt仓库。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
执行以下命令,安装nvidia-docker2。
sudo apt-get update sudo apt-get install -y nvidia-docker2
执行以下命令,重启Docker。
sudo systemctl restart docker
验证是否安装成功。
sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
回显如下,表示安装成功。
docker pull nvcr.io/nvidia/nemo:24.01.framework
依次执行以下命令,配置 packagecloud 存储库并安装git-lfs。
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash apt-get install git-lfs
依次执行以下命令,安装git。
apt-get update # 更新安装包列表 apt-get install git # 安装git apt-get install git-lfs # 安装git-lfs
执行以下命令,初始化git-lfs。
git lfs install
回显如下,表示初始化完成。
执行以下命令,下载Lambada模型的权重文件模型到指定目录,本文以下载到 gpt3_dataset
为例。
git clone https://huggingface.co/ayrnb/megatron_nemo gpt3_dataset
说明
您可以使用训练好的nemo模型或者ckpt文件,例如megatron_gpt_te_true_bf16.nemo、 megatron_gpt-*last.ckpt等。也可以使用提供的模型,可前往huggingface获取模型地址(已包含需要的数据集及分词文件)。
执行以下命令,启动容器。
docker run -it --gpus=all --privileged --shm-size=100g -v /gpt3_dataset/:/gpt3_dataset/ nvcr.io/nvidia/nemo:24.01.framework bash
修改环境配置文件
vim /opt/NeMo-Megatron-Launcher/launcher_scripts/conf/config.yaml
参数名称 | 设置值 |
---|---|
defaults下的evaluation | NeMo提供了多种不同类型任务的数据集进行评估,这里设置为gpt3/evaluate_lambada,来使用lambada进行评估 |
stages | 注释除evaluation以外的参数 |
cluster_type | interactive |
launcher_scripts_path | /opt/NeMo-Megatron-Launcher/launcher_scripts |
data_dir | /gpt3_dataset/lambada_test.jsonl |
TRANSFORMERS_OFFLINE | 0 |
esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。修改评估配置文件
vim /opt/NeMo-Megatron-Launcher/launcher_scripts/conf/evaluation/gpt3/evaluate_lambada.yaml
参数名称 | 参数说明 | 设置值 |
---|---|---|
tasks | 进行评估的任务 | lambada |
nemo_model | 预训练的nemo模型地址 | /gpt3_dataset/megatron_gpt_te_false_bf16.nemo |
vocab_file | 分词文件目录 | /gpt3_dataset/vocab.json |
merge_file | /gpt3_dataset/merges.txt | |
hparams_file | /gpt3_dataset/hparams.yaml | |
pipeline_model_parallel_size | 流水线并行数量,与训练时相同 | 2 |
esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。/opt/NeMo-Megatron-Launcher/launcher_scripts/
路径下新建运行脚本exec.sh
。cd /opt/NeMo-Megatron-Launcher/launcher_scripts/ vi exec.sh
#!/bin/bash export NVTE_FUSED_ATTN=1 export NVTE_FLASH_ATTN=1 rm -rvf /megatron_nemo/results/ HYDRA_FULL_ERROR=1 python3 main.py
esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。exec.sh
文件添加可执行权限。chmod +x exec.sh
./exec.sh
TP | PP | MBS | GBS | TE | dtype | Lambada | |
---|---|---|---|---|---|---|---|
PPL(越低越好) | ACC(越高越好) | ||||||
2 | 1 | 1 | 2048 | TRUE | FP8 | 927.8558 | 0.1265 |
2 | 1 | 1 | TRUE | TEBF16 | 1035.1385 | 0.1244 | |
2 | 1 | 1 | FALSE | BF16 | 1133.339 | 0.1098 |