亚马逊AWS官方博客

在 Amazon sagemaker 上微调与部署 BioBERT 模型

BioBERT是一种生物医学语言表示模型,常用于生物医学中的命名实体识别、关系提取、问答等生物医学文本挖掘任务。Nvidia NGC Catalog 是一套GPU优化的可用于人工智能,高性能计算以及数据分析软件集,包含了丰富的预训练模型,其中有 tensorflow BioBERT 预训练模型 (https://ngc.nvidia.com/catalog/resources/nvidia:biobert_for_tensorflow/quickStartGuide) Amazon SageMaker 是一项完全托管的服务,可以帮助开发人员和数据科学家快速构建、训练和部署机器学习 (ML) 模型。SageMaker 完全消除了机器学习过程中每个步骤的繁重工作,让开发高质量模型变得更加轻松。在这篇blog中,我们将探索如何让Nvidia NGC BioBERT 预训练模型在 Amazon SageMaker 上 finetune 与部署。

首先打开Amazon sagemaker 控制界面,点击【创建笔记本实例】

输入【笔记本实例名称】,选择适当的笔记本实例类型

在 IAM 角色选项上选择【创建新角色】

点击【创建笔记本实例】创建 notebook

当笔记本实例状态变成 InService 后,点击【打开 JupyterLab】

在弹出的 jupyter 页面,依次选择 File – New – Terminal,进入 Terminal 界面并从 Git 获取脚本,以下脚本来源于 https://github.com/NVIDIA/DeepLearningExamples/tree/master/TensorFlow/LanguageModeling/BERT


sh-4.2$ cd SageMaker/

sh-4.2$ git clone https://github.com/zhaoanbei/sagemaker-Nvidia-NGC-biobert.git

Git克隆完毕后,打开目录 sagemaker-Nvidia-NGC-biobert,并双击打开文件 run_ner.py

可以看到,该文件使用tf.flags进行传参,参数有task_name,data_dir,output_dir,bert_config_file,do_train,do_eval,do_predict 等。训练支持horovod 进行分布式训练。找到biobert_finetune.ipynb,双击打开,并在右上角选择 conda_tensorflow_p36

在第一行,我们验证了conda 环境下有对应的 tensorflow 框架。随后以 json 格式定义超参。

在上面脚本中,我们启用了了 MPI 分布框架,定义run_ner.pyentry_point,并指定了对应的运行环境与实例配置。注意:在执行estimator.fit() 操作时,需要指定对应的数据位置。原数据位于 https://d13loqfldp8rtf.cloudfront.net/data.zip 我们可以在 jupyter 终端中调用 wget https://d13loqfldp8rtf.cloudfront.net/data.zip,解压后上传到该 region 所在的 S3 存储桶,然后替换上图中的S3路径 s3://sagemaker-us-east-2-310850127430/biobertner/ 数据在S3 路径下的目录结构如下图所示:

触发 estimator.fit() 之后,我们可以在控制台获得训练的任务名称。

待训练完成之后,我们需要将脚步中的 TrainingJobName 修改成上图中的任务名称。如果你不是在 us-east-2上训练,同时还需要将us-east-2 修改成对应的region。例如东京 region 是 ap-northeast-1

这一步会输出 EndpointConfigArn

接下来我们生成模型,推理 endpoint 配置与封装 endpoint。

这里需要将 endpoint_config_1_name 修改成上一步获得的EndpointConfigArn

在生成模型调用 client.create_model 接口时,我们会调用之前 TrainingJob 的 metadata 获取在S3上的训练结果。具体关于上述 api 接口需要录入的参数,详见https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html

在输出InService后,在 SageMaker 主控制台Inference 下会看到对应endpoint信息。

接下来运行 Infer下的代码,调用 boto3 sagemaker-runtime 类可以显示推理结果。

在这个过程中,我们对于 NVIDIA/DeepLearningExamples 这一 github repository 下的代码改动量非常小,只需要对于源码中 data_dir,output_dir等路径变量进行修正,并补充工程化过程中的逻辑和配置代码即可。

本文讲解了如何使用 Amazon SageMaker  运行基于 Nvidia NGC 的 biobert finetune 与模型部署,最终暴露出来 api 调用接口来供终端用户使用。同时,本文展示了如何把一个基于已有的 tensorflow,horovod 框架的分布式项目快速运行到 Amazon SageMaker 上,并利用亚马逊的机器学习平台快速实现本地机器学习工程化,加速机器学习项目的架构优化与落地。

本篇作者

赵安蓓

AWS解决方案架构师,负责基于AWS云平台的解决方案咨询和设计,尤其在大数据分析与建模领域有着丰富的实践经验。

吴金福

AWS 混合云方案架构师,负责基于AWS的混合云方案架构的咨询和设计。在加入AWS之前,就职于大型集团企业。负责私有云数据中心的方案设计和建设,在数据中心基础设施、虚拟化、高性能计算和混合云等领域有着多年的经验积累。