使用Amazon SageMaker JumpStart进行零-shot文本分类

使用Amazon SageMaker JumpStart进行零-shot文本分类

自然语言处理(NLP)是机器学习(ML)领域的一个分支,关注的是使计算机能够像人类一样理解文本和口语。最近,像Transformer架构这样的最新技术被用于在NLP下游任务中实现接近人类水平的性能,例如文本摘要、文本分类、实体识别等。

大型语言模型(LLM)是基于Transformer的模型,通过对大量未标记文本进行训练,参数数量从数亿(BERT)到万亿(MiCS),其规模使得单GPU训练变得不可行。由于其固有的复杂性,从零开始训练一个LLM是一项非常具有挑战性的任务,只有极少数组织能够承担。在NLP下游任务中,一种常见的做法是采用预训练的LLM并对其进行微调。有关微调的更多信息,请参阅Amazon SageMaker JumpStart上有关基础模型的领域自适应微调以及Amazon SageMaker上使用Hugging Face对Transformer语言模型进行多样性语言微调。

NLP中的零样本学习允许预训练的LLM对其未经明确训练的任务生成响应(甚至无需微调)。具体而言,就文本分类而言,零样本文本分类是自然语言处理中的一项任务,其中使用NLP模型对属于训练数据中不存在的类别的文本进行分类,与监督分类相对,后者只能对属于训练数据类别的文本进行分类。

我们最近在Amazon SageMaker JumpStart中推出了对零样本分类模型的支持。SageMaker JumpStart是Amazon SageMaker的机器学习中心,提供访问预训练的基础模型(FMs)、LLMs、内置算法和解决方案模板,帮助您快速入门机器学习。在本文中,我们将展示如何使用SageMaker JumpStart中的预训练模型执行零样本分类。您将学习如何使用SageMaker JumpStart UI和SageMaker Python SDK部署解决方案并使用可用模型进行推理。

零样本学习

零样本分类是一种范式,其中模型可以对属于训练数据中不存在的类别的新的未见示例进行分类。例如,一个训练过理解人类语言的语言模型可以用于对多个类别的新年决心推文进行分类,如careerhealthfinance,而无需对语言模型进行显式的文本分类训练。这与微调模型不同,后者意味着通过迁移学习重新训练模型,而零样本学习不需要额外的训练。

下图说明了迁移学习(左)与零样本学习(右)之间的区别。

尹等人提出了一种使用自然语言推理(NLI)创建零样本分类器的框架。该框架通过将待分类的序列作为NLI前提提出,并从每个候选标签中构造一个假设。例如,如果我们想要评估一个序列是否属于类别politics,我们可以构造一个假设:“这段文本是关于政治的。”然后将蕴含和矛盾的概率转换为标签概率。简要回顾一下,NLI考虑了两个句子:前提和假设。任务是确定在给定前提的情况下,假设是真(蕴含)还是假(矛盾)。以下表格提供了一些示例。

前提 标签 假设
一个人在检查某个东亚国家的制服。 矛盾 这个人正在睡觉。
一个年长的和一个年轻的人在微笑。 中性 两个人在笑,因为猫在地板上玩耍。
一场有多个男子参加的足球比赛。 蕴含 一些人正在进行体育运动。

解决方案概述

在本文中,我们将讨论以下内容:

  • 如何使用SageMaker JumpStart UI部署预训练的零样本文本分类模型,并使用短文本数据对部署的模型进行推理
  • 如何使用SageMaker Python SDK访问SageMaker JumpStart中预训练的零样本文本分类模型,并使用推理脚本将模型部署到SageMaker终端节点,用于实时文本分类用例
  • 如何使用SageMaker Python SDK访问预训练的零样本文本分类模型,并使用SageMaker批量转换进行批量文本分类用例

SageMaker JumpStart提供了一键式微调和部署,适用于各种流行的机器学习任务的预训练模型,以及解决常见业务问题的端到端解决方案的选择。这些功能简化了机器学习过程中每个步骤的繁重工作,简化了高质量模型的开发,并缩短了部署时间。JumpStart API允许您在自己的数据集上以编程方式部署和微调各种预训练模型。

JumpStart模型中心提供了访问大量NLP模型的功能,这些模型可以对自定义数据集进行迁移学习和微调。截至本文撰写时,JumpStart模型中心包含了300多个文本模型,涵盖了各种流行模型,如Stable Diffusion、Flan T5、Alexa TM、Bloom等。

请注意,按照本节中的步骤部署基础设施到您的AWS账户可能会产生费用。

部署独立的零样本文本分类模型

在本节中,我们将演示如何使用SageMaker JumpStart部署零样本分类模型。您可以通过Amazon SageMaker Studio中的JumpStart登陆页面访问预训练模型。完成以下步骤:

  1. 在SageMaker Studio中打开JumpStart登陆页面。有关如何导航到SageMaker JumpStart的详细信息,请参阅打开和使用JumpStart。
  2. 文本模型轮播中,找到“零样本文本分类”模型卡片。
  3. 选择查看模型以访问facebook-bart-large-mnli模型。或者,您可以在搜索栏中搜索零样本分类模型,并在SageMaker JumpStart中找到该模型。
  4. 指定部署配置、SageMaker托管实例类型、终端节点名称、Amazon Simple Storage Service(Amazon S3)存储桶名称和其他必需参数。
  5. 可选地,您可以指定安全配置,如AWS Identity and Access Management(IAM)角色、VPC设置和AWS Key Management Service(AWS KMS)加密密钥。
  6. 选择部署以创建SageMaker终端节点。

此步骤需要几分钟时间才能完成。完成后,您可以对托管零样本分类模型的SageMaker终端节点进行推理。

在下面的视频中,我们展示了本节中步骤的演示。

使用SageMaker SDK以编程方式使用JumpStart

在SageMaker Studio的SageMaker JumpStart部分的快速开始解决方案下,您可以找到解决方案模板。SageMaker JumpStart解决方案模板是许多常见机器学习用例的一键式端到端解决方案。截至本文撰写时,有20多个解决方案可用于多个用例,例如需求预测、欺诈检测和个性化推荐等。

“基于Hugging Face的零样本文本分类”解决方案提供了一种使用预训练文本分类器对文本进行分类(零样本分类)而无需针对特定标签训练模型的方法。此解决方案的默认零样本分类模型是facebook-bart-large-mnli(BART)模型。对于此解决方案,我们使用2015年新年决心数据集来对决心进行分类。解决方案资产中仅包含Resolution_Category(真实标签)和text列的原始数据集的子集。

输入数据包括文本字符串,用于分类的期望类别列表,以及分类是否为多标签用于同步(实时)推理。对于异步(批处理)推理,我们提供一个文本字符串列表,每个字符串的类别列表,以及分类是否为多标签,保存在一个JSON行格式的文本文件中。

<p推理的结果是一个JSON对象,类似于以下屏幕截图。

我们在sequence字段中有原始文本,在labels字段中有用于文本分类的标签,在scores字段中有分配给每个标签的概率(按照出现的顺序)。

完成以下步骤部署使用Hugging Face的零-shot文本分类解决方案:

  1. 在SageMaker JumpStart着陆页上,在导航窗格中选择模型、笔记本、解决方案
  2. 解决方案部分,选择浏览所有解决方案
  3. 解决方案页面上,选择使用Hugging Face的零-shot文本分类模型卡片。
  4. 查看部署细节,如果同意,选择启动

<p部署将为实时推理提供一个SageMaker实时端点,并为批处理转换结果提供一个S3存储桶。

<p以下图示说明了该方法的架构。

使用零-shot分类模型进行实时推理

<p在本节中,我们将回顾如何使用Python SDK在SageMaker端点上实时运行零-shot文本分类(使用任何可用的模型)。

  1. <p首先,我们配置模型的推理负载请求。这取决于模型,但对于BART模型,输入是一个具有以下结构的JSON对象:

    {
    “inputs”: # 要分类的文本
    “parameters”: {
    “candidate_labels”: # 我们要用于文本分类的标签列表
    “multi_label”: True | False
    }
    }
  2. <p请注意,BART模型没有明确训练candidate_labels。我们将使用零-shot分类技术将文本序列分类到未知类别。以下代码是使用新年决心数据集和定义的类别的示例:

    classification_categories = ['健康', '幽默', '个人成长', '慈善', '休闲', '职业', '金融', '教育', '时间管理']
    data_zero_shot = {
    "inputs": "#新年决心 :: 多读书,早餐前不浏览fb/查看邮件,坚持做体能训练/瑜伽缓解背部疼痛!",
    "parameters": {
    "candidate_labels": classification_categories,
    "multi_label": False
    }
    }
  3. <p接下来,您可以使用零-shot负载调用SageMaker端点。SageMaker端点作为SageMaker JumpStart解决方案的一部分部署。

    response = runtime.invoke_endpoint(EndpointName=sagemaker_endpoint_name,
    ContentType='application/json',
    Body=json.dumps(payload))
    
    parsed_response = json.loads(response['Body'].read())
  4. <p推理响应对象包含原始序列,按得分从高到低排序的标签,以及每个标签的分数:

    {'sequence': "#新年决心 :: 多读书,早餐前不浏览fb/查看邮件,坚持做体能训练/瑜伽缓解背部疼痛!",
    'labels': ['个人成长',
    '健康',
    '时间管理',
    '休闲',
    '教育',
    '幽默',
    '职业',
    '慈善',
    '金融'],
    'scores': [0.4198768436908722,
    0.2169460505247116,
    0.16591140627861023,
    0.09742163866758347,
    0.031757451593875885,
    0.027988269925117493,
    0.015974704176187515,
    0.015464971773326397,
    0.008658630773425102]}

使用Python SDK运行SageMaker批量转换作业

本节介绍如何使用SageMaker Python SDK运行零-shot分类facebook-bart-large-mnli模型的批量转换推理。完成以下步骤:

  1. 以JSON lines格式格式化输入数据并将文件上传到Amazon S3。SageMaker批量转换将对在S3文件中上传的数据点进行推理。

  2. 使用以下参数设置模型部署工件:

    1. model_id – 使用huggingface-zstc-facebook-bart-large-mnli

    2. deploy_image_uri – 使用image_uris Python SDK函数获取model_id的预构建SageMaker Docker镜像。该函数返回Amazon Elastic Container Registry (Amazon ECR) URI。

    3. deploy_source_uri – 使用script_uris实用API检索包含运行预训练模型推理的脚本的S3 URI。我们将script_scope指定为inference

    4. model_uri – 使用model_uri从Amazon S3获取指定model_id的模型工件。

      #导入
      from sagemaker import image_uris, model_uris, script_uris, hyperparameters
      
      #设置模型id和版本
      model_id, model_version, = (
      "huggingface-zstc-facebook-bart-large-mnli",
      "*",
      )
      
      #检索推理Docker容器URI。这是默认模型的基本Hugging Face容器镜像。
      deploy_image_uri = image_uris.retrieve(
      region=None,
      framework=None, #从model_id自动推断
      image_scope="inference",
      model_id=model_id,
      model_version=model_version,
      instance_type="ml.g4dn.xlarge",
      )
      
      #检索推理脚本URI。这包括所有依赖项和用于模型加载、推理处理等的脚本。
      deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference")
      
      #检索模型URI。这包括预训练模型和参数。
      model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")
  3. 使用HF_TASK定义Hugging Face transformers pipeline的任务,使用HF_MODEL_ID定义用于分类文本的模型:

    # Hub模型配置 <https://huggingface.co/models>
    hub = {
    'HF_MODEL_ID':'facebook/bart-large-mnli', # Hugging Face Hub中的model_id
    'HF_TASK':'zero-shot-classification' # 您要用于预测的NLP任务
    }

    有关任务的完整列表,请参阅Hugging Face文档中的Pipelines。

  4. 创建一个Hugging Face模型对象,以便与SageMaker批量转换作业一起部署:

    # 创建HuggingFaceModel类
    huggingface_model_zero_shot = HuggingFaceModel(
    model_data=model_uri, # 指向您训练的SageMaker模型的路径
    env=hub, # 从Hub加载模型的配置
    role=role, # 具有创建端点权限的IAM角色
    transformers_version="4.17", # 使用的Transformers版本
    pytorch_version="1.10", # 使用的PyTorch版本
    py_version='py38', # 使用的Python版本
    )
  5. 创建一个transformer来运行批量作业:

    # 创建transformer来运行批量作业
    batch_job = huggingface_model_zero_shot.transformer(
    instance_count=1,
    instance_type='ml.m5.xlarge',
    strategy='SingleRecord',
    assemble_with='Line',
    output_path=s3_path_join("s3://",sagemaker_config['S3Bucket'],"zero_shot_text_clf", "results"), # 我们正在使用相同的s3路径将输出保存与输入
    )
  6. 启动批量转换作业并使用S3数据作为输入:

    batch_job.transform(
    data=data_upload_path,
    content_type='application/json',
    split_type='Line',
    logs=False,
    wait=True
    )

您可以在SageMaker控制台上监控批处理作业(在导航窗格中选择推理下的批处理转换作业)。作业完成后,您可以在output_path指定的S3文件中检查模型预测输出。

有关SageMaker JumpStart中所有可用的预训练模型列表,请参阅带有预训练模型表的内置算法。在搜索栏中使用关键字“zstc”(代表零样本文本分类)来查找所有能够进行零样本文本分类的模型。

清理

在运行笔记本完成后,请确保删除在此过程中创建的所有资源,以确保停止此指南中部署的资产所产生的费用。清理已部署资源的代码已提供在与零样本文本分类解决方案和模型相关的笔记本中。

默认安全配置

SageMaker JumpStart模型使用以下默认安全配置进行部署:

  • 模型使用默认的SageMaker执行角色进行部署。您可以指定自己的角色或使用现有的角色。有关更多信息,请参阅SageMaker角色。
  • 模型不会连接到VPC,并且不会为您的模型提供虚拟私有云。您可以指定VPC配置以从安全选项中连接到您的模型。有关更多信息,请参阅在您的Amazon VPC中给SageMaker托管的端点访问资源。
  • 默认使用KMS密钥来加密模型的工件。您可以指定自己的KMS密钥或使用现有的密钥。有关更多信息,请参阅使用AWS KMS密钥(SSE-KMS)进行服务器端加密。

要了解有关SageMaker安全相关主题的更多信息,请参阅配置Amazon SageMaker中的安全性。

结论

在本文中,我们向您展示了如何使用SageMaker JumpStart UI部署零样本分类模型,并使用部署的端点进行推理。我们使用了SageMaker JumpStart新年愿望解决方案,以展示您如何使用SageMaker Python SDK构建端到端解决方案并实现零样本分类应用程序。SageMaker JumpStart提供了访问数百个预训练模型和解决方案的功能,用于计算机视觉、自然语言处理、推荐系统等任务。请自行尝试该解决方案,并告诉我们您的想法。