亚马逊AWS官方博客

基于Amazon SageMaker构建细粒度情感分析应用

背景介绍

细粒度情感分析(Aspect-Based Sentiment Analysis,ABSA)由于其广阔的业务价值而吸引越来越多的从业者投身其中,通过分析客户评论数据中的情感偏好往往有利于企业探寻客户关注点,挖掘客户需求,加速产品迭代,提高营销效率,完善售后服务等。毫不夸张地说,发掘出客户的声音(voice of customer)就抢占了企业发展的先机。

Voice of Customer (VOC) 是近年来各行业都在关注的概念,而亚马逊作为全球最注重“以客户为中心”理念的企业早在2018年就推出了“买家之声”(VOC)板块,助力买卖双方互利共赢。AWS始终致力于“以客户为中心”的技术创新,针对VOC场景, 我们针对不同行业客户的实际业务需求进行了广泛的技术实践,并且最终基于自然语言生成(NLG)技术结合Amaozn SageMaker搭建了一套高效的、可定制的、细粒度的生成式评论分析方案, 以提取评论中不同方面(Aspect)的情感极性并且以其中的观点词(Opinion)为佐证。

举个例子:“今天的沙拉很好吃但是牛排不新鲜”,这里同时存在两个情感极性,对于正向情感(positive), 其方面词是“沙拉”,对应的观点词为“很好吃”;对于负向情感(negative),其方面词是“牛排”,对应的观点词为“不新鲜”。在这样的场景下,我们通过AI把用户留言进行了更高维度的知识提取(方面词,方面词类别,观点词,情感极性),这些高维知识使得客户可以更精准地对(几千倍几万倍的机器标签)用户进行分类,从而在广告投放、行为诱导、客户服务和产品升级方面有更优化的方法。

Amazon SageMaker是亚马逊云计算(Amazon Web Service)的一项完全托管的机器学习平台服务,算法工程师和数据科学家可以基于此平台快速构建、训练和部署机器学习 (ML) 模型,而无需关注底层资源的管理和运维工作。它作为一个工具集,提供了用于机器学习的端到端的所有组件,包括数据标记、数据处理、算法设计、模型训练、训练调试、超参调优、模型部署、模型监控等,使得机器学习变得更为简单和轻松;同时,它依托于AWS强大的底层资源,提供了高性能CPU、GPU、弹性推理加速卡等丰富的计算资源和充足的算力,使得模型研发和部署更为轻松和高效。同时,本文还基于Huggingface,Huggingface是NLP著名的开源社区,并且与Amazon SagaMaker高度适配,可以在Amazon SagaMaker上以几行代码轻松实现NLP模型训练和部署。

解决方案概览

在此示例中, 我们将使用Amazon SageMaker执行以下操作:

  • 环境准备
  • 数据准备
  • 使用 Amazon SageMaker BYOS进行模型训练
  • 托管部署及推理测试

环境准备

我们首先要创建一个Amazon SageMaker Notebook,由于本次实验全程不会用到本地GPU训练,所以笔记本实例类型可以任意选择。

笔记本启动后,打开页面上的终端,执行以下命令下载代码。

cd ~/SageMaker
git clone https://github.com/HaoranLv/GAS-SageMaker.git

数据准备

目前的ABSA存在多种子任务,分别用于聚焦于不同的情感元素,这里我们给出目前主流的ABSA任务:

由于子任务众多,故本文以TASD为例进行实验,数据按照固定格式存储到txt文件中,具体格式为:

句子####[(aspect term, aspect category, sentiment polarity)]

所使用的的所有数据均来自公开的数据集。数据的存储位置为./data/tasd/。

数据集的具体介绍可以参照:

使用 Amazon SageMaker BYOS进行模型训练

对于目前主流的深度学习框架(Tensorflow、Pytorch、 Mxnet),Amazon SageMaker均提供预置的镜像。具体来说,对于某个开源代码,如果其使用主流的深度学习框架编码,则理论上我们就可以通过Amazon SageMaker进行BYOS模式的调用。

首先,我们将数据进行预处理并保存到本地或者S3,而后我们只需要将训练所需的脚本以及其依赖准备好,就可以通过实例化estimator进行模型训练和部署,实际过程中会启动EC2训练实例并且加载预置的镜像并启动容器,而后数据将会以pipeline的形式传输到EC2训练实例进行模型训练,训练完成后所有的日志均会储存在CloudWatch中,训练得到的模型文件也会储存在S3的特定位置以供后续使用。本文主要演示Pytorch框架下对ABSA生成任务进行BYOS的实验过程。

在Jupyter Notebook中打开gabsa.ipynb 逐行运行。

引入依赖并进行权限配置

import sagemaker as sage
from time import gmtime, strftime
from sagemaker import get_execution_role
from sagemaker.pytorch import PyTorch
sess = sagemaker.Session()
role = sagemaker.get_execution_role()

print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")

将处理好的数据上传到S3

WORK_DIRECTORY = "./data"
# S3 prefix
prefix = "demo"
data_location = sess.upload_data(WORK_DIRECTORY, key_prefix=prefix)

定义超参数,本次实验使用Huggingface hub公开的T5-base预训练参数进行初始化

hyperparameters = {
    "task" : "tasd", 
    "dataset" : "rest15", 
    "model_name_or_path" : "t5-base", 
    "paradigm": "extraction",
    "eval_batch_size" :"16",
    "train_batch_size" :"2",
    "learning_rate" :"3e-4",
    "num_train_epochs":"30",
    "n_gpu": "1"
}

实例化estimator,由于代码使用Pytorch框架,故这里直接使用SageMaker预置的Pytorch容器

entry_point = 'finetune.py'
source_dir = ‘./ ’
git_config = None
framework_version = '1.7.1'
py_version='py36'
instance_type='ml.p3.2xlarge'
instance_count=1
estimator = PyTorch(
    entry_point = entry_point,
    source_dir = source_dir,
    git_config = git_config,
    role = role,
    debugger_hook_config=False,
    hyperparameters = hyperparameters,
    framework_version = framework_version, 
    py_version = py_version,
    instance_type = instance_type,
    instance_count = instance_count
)

启动模型训练

inputs = {'tasd': data_location+'/tasd/'}
response = estimator.fit(inputs)

训练启动后,我们可以在Amazon SageMaker控制台看到这个训练任务,点进详情可以看到训练的日志输出,以及监控机器的GPU、CPU、内存等的使用率等情况,以确认程序可以正常工作。训练完成后也可以在CloudWatch中查看训练日志。

托管部署及推理测试

完成训练后,我们可以轻松的将上面的模型部署成一个实时可在生产环境中调用的端口。

import sagemaker
instance_type = 'ml.m5.4xlarge'
role = sagemaker.get_execution_role()
from sagemaker.pytorch.model import PyTorchModel

pytorch_model = PyTorchModel(model_data='s3://sagemaker-ap-southeast-1-116572824542/pytorch-training-2022-05-28-10-05-39-029/output/model.tar.gz', 
                             role=role,
                             entry_point='inference.py', 
                             source_dir='./', 
                             framework_version='1.7.1', 
                             py_version='py36'
                ) # TODO set model_server_workers=1 to avoid torchhub bug

predictor = pytorch_model.deploy(instance_type=instance_type, initial_instance_count=1)

部署完成后可以在控制台看到如下状态:

而后我们可以进行endpoint调用

predictor.predict({"inputs": "Worth an hour of frustration to put together Although not the easiest product I’ve ever assembled, it was worth the few minutes of cursing. I have not decided where I will put the lamp but I’m glad I purchased it. Had to struggle with one that was lost but Amazon made that right by sending another. Others have complained about the shade but that was very simple to put together. It looks like a quality item especially when compared to floor lamps I’ve seen on the floor at stores like Home Goods or Lowes. I’m happy with it. "}, initial_args={'ContentType': 'application/json'})

输出结果为:

[( lamp, product, POSITIVE ); ( NULL, Services, POSITIVE )]

以上就是使用Amazon SageMaker构建细粒度情感分析应用的全部过程,可以看到通过Amazon SageMaker可以非常便利地结合Huggingface进行NLP模型的搭建,训练,部署的全流程。整个过程仅需要准备训练脚本以及数据即可通过若干命令启动训练和部署,同时,我们后续还会推出,使用Amaozn SageMaker进行更多NLP相关任务的实现方式,敬请关注。

参考资料

本篇作者

吕浩然

亚马逊云科技应用科学家,长期从事计算机视觉,自然语言处理等领域的研究和开发工作。支持数据实验室项目,在时序预测,目标检测,OCR,自然语言生成等方向有丰富的算法开发以及落地实践经验。