在当今的技术领域,自然语言处理(NLP)技术的应用越来越广泛。Hugging Face作为开源领域的佼佼者,提供了最先进的NLP技术。与此同时,AWS的SageMaker提供了高性能的资源来训练和部署NLP模型。本文将详细介绍如何利用SageMaker和Hugging Face的深度学习容器(DLC)进行模型的训练和推理,以及如何通过SageMaker SDK启动可扩展、成本效益高的NLP脚本训练作业。
使用SageMaker和Hugging Face模型具有多方面的优势。首先,SageMaker优化了规模、性能和效率,从而降低了成本。使用EC2 Spot实例可以进一步节省非关键工作负载的成本。其次,SageMaker支持MLOps,包括自动元数据持久化和搜索、日志提取到Amazon CloudWatch、使用SageMaker Debugger和Profiler进行监控以及实验管理。此外,SageMaker能够运行在GPU集群上,提供高效的数据并行和模型并行分布。在安全性方面,SageMaker提供了高标准的安全机制,包括静态和传输中的加密、VPC连接和细粒度的IAM权限。最后,SageMaker直接得到Hugging Face和AWS的支持,包括最新的Hugging Face和AWS创新。
首先,需要登录到AWS控制台。如果还没有账户,可以创建一个并使用AWS提供的免费额度。登录后,搜索SageMaker服务并点击进入。在SageMaker的首页左侧,会找到“Notebook”选项,点击并选择“Notebook实例”,然后点击“创建Notebook实例”。为实例命名,并选择SageMaker执行角色。在Git选项中选择“从公共仓库克隆”,并粘贴以下链接:https://github.com/philschmid/huggingface-sagemaker-workshop-series.git(这是Hugging Face的官方仓库),然后点击创建。实例准备就绪后,点击“打开Jupyter”,进入workshop1文件夹并打开lab1笔记本。如果没有自动设置为conda_pytorch_36内核,请手动选择。
import sagemaker
sess = sagemaker.Session()
# sagemaker session bucket -> 用于上传数据、模型和日志
# sagemaker将自动创建此存储桶,如果它不存在
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
# 如果没有给定存储桶名称,则设置为默认存储桶
sagemaker_session_bucket = sess.default_bucket()
role = sagemaker.get_execution_role()
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
作为一个托管服务,Amazon SageMaker在授权的AWS硬件上代表执行操作。SageMaker只能执行用户允许的操作。SageMaker用户可以通过IAM角色(称为执行角色)授予这些权限。
本教程将执行多类分类任务。使用的是“情感”数据集,包含6个类别:愤怒、恐惧、喜悦、爱、悲伤和惊讶。将下载数据集,将其分割为训练集和测试集,进行预处理,并将其推送到S3存储桶,因为SageMaker要求数据必须位于S3存储桶中。运行“预处理和上传数据”部分的单元格以执行上述步骤。
# 检查数据集标签和信息
train_dataset.features['labels'].num_classes
train_dataset.features['labels'].names
train_dataset.info
如果想了解可以对数据集对象执行哪些操作,可以参考。一旦数据集预处理并上传到S3,现在可以进行微调步骤。首先,需要创建一个Hugging Face Estimator,它将处理训练和部署。需要提供训练脚本作为入口点和实例配置,例如实例类型和实例数量。
# 超参数,传递给训练作业
hyperparameters={'epochs': 1, # 训练周期数
'train_batch_size': 32, # 训练的批次大小
'eval_batch_size': 64, # 评估的批次大小
'learning_rate': 3e-5, # 训练期间使用的学习能力
'model_id':'distilbert-base-uncased', # 预训练模型
'fp16': True, # 是否使用16位(混合)精度训练
}
定义训练作业名称,并创建Estimator。
# 定义训练作业名称
job_name = f'huggingface-workshop-{time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())}'
# 创建Estimator
huggingface_estimator = HuggingFace(
entry_point = 'train.py', # 训练作业中使用的微调脚本
source_dir = './scripts', # 微调脚本存储的目录
instance_type = 'ml.p3.2xlarge', # 训练作业使用的实例类型
instance_count = 1, # 训练使用的实例数量
base_job_name = job_name, # 训练作业的名称
role = role, # 训练作业使用的IAM角色,用于访问AWS资源,例如S3
transformers_version = '4.6.1', # 训练作业中使用的transformers版本
pytorch_version = '1.7.1', # 训练作业中使用的pytorch版本
py_version = 'py36', # 训练作业中使用的Python版本
hyperparameters = hyperparameters, # 运行训练作业使用的超参数
)
使用了支持GPU的'ml.p3.2xlarge'实例类型。训练脚本train.py包含训练和评估模型的代码。它使用Hugging FaceTransformer的trainer类来训练模型。
# 创建Trainer实例
trainer = Trainer(
model=model,
args=training_args,
compute_metrics=compute_metrics,
train_dataset=train_dataset,
eval_dataset=test_dataset,
tokenizer=tokenizer,
)
def compute_metrics(eval_pred):
predictions, labels = eval_pred
predictions = np.argmax(predictions, axis=1)
return metric.compute(predictions=predictions, references=labels)
# 使用Trainer实例的train方法训练模型
trainer.train()
# 在测试数据上评估模型
eval_result = trainer.evaluate(eval_dataset=test_dataset)
# 最后,将模型保存到SageMaker模型目录,最终上传到S3存储桶
trainer.save_model(os.environ["SM_MODEL_DIR"])
回到笔记本,运行estimator的fit方法开始微调任务,提供保存数据集的S3数据路径。
# 定义一个包含上传的S3 URI的数据输入字典
data = {
'train': training_input_path,
'test': test_input_path
}
# 使用上传的数据集作为输入启动训练作业
huggingface_estimator.fit(data, wait=True)
如果遇到资源限制超出错误,请按照提高所需资源的服务限制。
如果想使用'ml.g4dn.xlarge'实例托管模型,可以创建另一个SageMaker托管实例;否则,可以选择'ml.m4.xlarge'实例,该实例有2个实例的限制。
# 一旦模型训练完成,可以使用SageMaker端点托管模型
predictor = huggingface_estimator.deploy(1, "ml.g4dn.xlarge") # ml.m4.xlarge
# 可以使用predict方法向创建的predictor对象提交推理请求
sentiment_input= {"inputs": "I get so nervous before a demo"}
predictor.predict(sentiment_input)
已经成功地在AWSSageMaker上微调和部署了Hugging Face模型。不要忘记删除端点,以免产生额外的费用。
predictor.delete_endpoint()