关于机器学习:Generative-AI-新世界-大语言模型LLMs在-Amazon-SageMaker-上的动手实践

49次阅读

共计 18149 个字符,预计需要花费 46 分钟才能阅读完成。

在上一篇《Generative AI 新世界:大型语言模型(LLMs)概述》中,咱们一起探讨了大型语言模型的倒退历史、语料起源、数据预处理流程策略、训练应用的网络架构、最新钻研方向剖析(Amazon Titan、LLaMA、PaLM-E 等),以及在亚马逊云科技上进行大型语言模型训练的一些最佳落地实际等。

本期文章,咱们将重点探讨入手实际,通过三个入手试验从浅到深地解读和演示大型语言模型(LLMs),如何联合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等方面。

亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注 / 珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库!

试验一:应用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器人利用

开发者能够应用 Amazon SageMaker 构建一个交互式的人机对话利用 DEMO,尝试基于开源 GPT-J 模型的 Text Generation 技术。Amazon SageMaker 是亚马逊云科技私有云中的一项托管服务。作为一个云机器学习平台,能够让开发者在云中创立、训练和部署 ML 模型。

这一入手试验仅仅应用 20 行左右的代码,即可将开源的 GPT-J 模型部署到 Amazon SageMaker 的终端节点(Endpoint),实现交互式人机对话。实现该试验的代码编写和模型部署预计须要 20 分钟。

什么是 GPT-J:

GPT-J 是一种生成式预训练(GPT)语言模型,就其架构而言,它可与 GPT-3 等风行的公有大型语言模型相媲美。它由大概 60 亿个参数和 28 个层组成,包含一个前馈模块和一个自注意力模块。为 GPT-J 提供推理所需的内存要低得多——在 FP16 中,模型权重占用不到 13 GB,这意味着能够在单个 16GB GPU 上轻松进行推理。

本试验参考代码的 GitHub 地址: https://github.com/hanyun2019/aigc/blob/main/deploy-gptj.ipynb?trk=cndc-detail

创立 SageMaker Notebook 实例

在亚马逊云科技控制台(console.aws.amazon.com)上,输出“Amazon SageMaker”并点击进入,而后在左侧导航菜单中找到“Notebook instances”,点击右上角的“Create notebook instance”开始创立。如下图所示:

在创立 Notebook instances 的过程中,须要指定在 Amazon SageMaker 中运行代码的角色(role)。因为须要拜访 Amazon S3 等资源(寄存模型训练须要的数据、模型构件等),因而必须设置适合的角色(role)使其具备拜访相干 Amazon S3 的权限。如下图所示:

提交后期待几分钟,能够看到状态变成“InService”,即示意该实例曾经胜利创立。如下图所示:

如果之前曾经创立过(并且没有 delete),能够间接点击”Start”重新启动实例。如下图所示:

当状态从“Pending”变成“InService”,即示意该实例曾经胜利启动。如下图所示:

进入 Open Jupyter/JupyterLab 环境

如下图,点击 Open Jupyter 或者 Open JupyterLab 环境。我集体更喜爱 Open JupyterLab,因而本文中会次要以 Open JupyterLab 来做解说和演示:

点击“Terminal”,以关上一个终端:

在关上的终端中输出以下命令:

$ pwd
$ cd SageMaker
$ git clone https://github.com/hanyun2019/aigc.git

左滑查看更多

输入如下:

这时你会看到左侧菜单栏减少了“aigc”目录:

该目录下的文件如下图所示:

双击“deploy-gptj.ipynb”关上这个文件,即可开始逐渐实现试验一:

应用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器人利用

以下逐行解释试验一的次要代码。

首先,须要装置 SageMaker 的相干 SDK:

!pip install -U sagemaker

而后 import 试验须要的 HuggingFace API 和 SageMaker 的 API 包:

from sagemaker.huggingface import HuggingFaceModel
import sagemaker

左滑查看更多

定义创立终端节点的 IAM 角色权限:

# IAM role with permissions to create endpoint
role = sagemaker.get_execution_role()

左滑查看更多

定义 GPT-J 模型构件所在的 S3 桶:

# public S3 URI to gpt-j artifact
model_uri="s3://huggingface-sagemaker-models/transformers/4.12.3/pytorch/1.9.1/gpt-j/model.tar.gz"

左滑查看更多

调用 HuggingFace API 来创立模型相干参数,包含:模型构件文件名、transformers 的版本号、PyTorch 的版本号、Python 的版本号、角色名等:

# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
    model_data=model_uri,
    transformers_version='4.12.3',
    pytorch_version='1.9.1',
    py_version='py38',
    role=role,
)

以上设置结束后,即可部署模型到 Amazon SageMaker 的终端节点了。能够在这里设置一些终端节点的参数,比方节点实例数量、节点类型等:

# deploy model to SageMaker Inference
predictor = huggingface_model.deploy(
    initial_instance_count=1, # number of instances
    instance_type='ml.g4dn.xlarge' #'ml.p3.2xlarge' # ec2 instance type
)

左滑查看更多

运行以上“huggingface_model.deploy”代码后,会在 Amazon SageMaker 控制台的“EndPoints”看到有实例正在创立(Creating)中,如下图所示:

当看到实例创立实现(InService),即可开始进行推理,即开始和聊天机器人对话了!

如下图所示,咱们询问的是中国香港地区的最高修建、最贵物业等信息。你能够本人定义问题,从中取得和大模型(GPT-J)聊天机器人对话的乐趣!

特地揭示:实现该试验后,记得删除终端节点,以防止不必要的终端节点免费。如下图所示:

试验二:应用 Amazon SageMaker 优化 GPT-2 模型的编译训练

该入手试验的指标是应用 Amazon SageMaker 训练编译器(Training Compiler) 的性能,在 Stanford Sentiment Treebank v2 (SST2) 数据集上优化 GPT-2 模型的编译和训练。

LLMs 模型根本都由简单的多层神经网络组成,具备数十亿以上的参数,可能须要数千个 GPU 小时甚至更多工夫能力实现训练。因而,在训练基础架构上优化此类模型须要丰盛的深度学习和系统工程常识。只管有些编译器的开源实现能够优化训练过程,但它们可能不足与某些硬件(例如 GPU 实例)集成的灵活性。Amazon SageMaker 训练编译器能够将深度学习模型从其高级语言示意模式转换为通过硬件优化的指令,从而放慢训练速度,帮忙缩小总计费时间。

在该入手试验中,咱们将一起体验如何在 Amazon SageMaker 中设置环境,包含权限设置、配置设置等。而后,咱们将体验如何应用 Amazon SageMaker 训练编译器,在 SST2 数据集上训练 GPT-2 模型。Amazon SageMaker 训练编译器已集成到 Amazon 深度学习容器(DLC)中,应用这些容器在 GPU 实例上编译和优化 GPU 实例上的训练作业,只需对代码进行起码的更改。

  • Amazon SageMaker 训练编译器参考文档:https://docs.aws.amazon.com/sagemaker/latest/dg/training-comp…
  • 本试验参考代码的 GitHub 地址: https://github.com/hanyun2019/aigc/blob/main/gpt-2.ipynb?trk=cndc-detail

Amazon SageMaker 训练编译器(Training Compiler)概述

Amazon SageMaker 训练编译器是 SageMaker 的一项优化性能,该优化性能能够帮忙缩短 GPU 实例上的训练工夫,该编译器通过更高效地应用 GPU 实例来减速训练过程。Amazon SageMaker Training Compiler 在 SageMaker 中是收费提供的,它能够放慢训练速度,从而帮忙缩小总计费时间。

SageMaker 训练编译器已集成到 Amazon 深度学习容器 (DLC) 中。应用反对 SageMaker 训练编译器的 Amazon DLC,您能够在 GPU 实例上编译和优化 GPU 实例上的训练作业,只需对代码进行起码的更改。

无关更多信息,请参阅《Amazon SageMaker 开发者指南》中的 SageMaker 训练编译器局部: https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/trainin…

试验筹备和数据集

在本试验中,你将应用 Hugging Face 的 transformers 和数据集库,与 Amazon SageMaker Training Compiler 在 Stanford Sentiment Treebank v2 (SST2) 数据集上训练 GPT-2 模型。请留神,应用此 notebook 将从 https://huggingface.co/datasets/sst2?trk=cndc-detail 下载 SST2 数据集,并能够在那里查看数据集信息和条款。

首先,咱们须要通过一些先决步骤来设置环境,例如权限、配置等。

留神:

  1. 你能够在 Amazon SageMaker Studio、Amazon SageMaker notebook 实例(即当初咱们在应用的形式)或设置了 Amazon CLI 的本地计算机上运行这个试验代码。如果应用 Amazon SageMaker Studio 或 Amazon SageMaker notebook 实例,请确保别离抉择基于 PyTorch 的内核之一,即 PyTorch 3 或 conda_pytorch_p38
  2. 本 notebook 应用了 2 个具备多个 GPU 的 ml.g4dn.12xlarge 实例。如果您没有足够的配额,请参阅以下链接的文档,申请减少 SageMaker 资源的服务配额:https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/regions…

试验开发环境设置

首先,须要装置 SageMaker Python SDK。这个试验须要装置 SageMaker Python SDK v2.108.0,如下代码所示:

!pip install "sagemaker>=2.108.0" botocore boto3 awscli pandas numpy –upgrade
import botocore
import boto3
import sagemaker
import pandas as pd

print(f"sagemaker: {sagemaker.__version__}")
print(f"boto3: {boto3.__version__}")
print(f"botocore: {botocore.__version__}")

左滑查看更多

其次,须要设置 Amazon SageMaker 的运行环境:

import sagemaker

sess = sagemaker.Session()

# SageMaker session bucket -> used for uploading data, models and logs
# SageMaker will automatically create this bucket if it does not exist
sagemaker_session_bucket = None
if sagemaker_session_bucket is None and sess is not None:
    # set to default bucket if a bucket name is not given
    sagemaker_session_bucket = sess.default_bucket()

role = sagemaker.get_execution_role()
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)

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

左滑查看更多

数据集加载

如果你关注数据集在何时加载的,能够在 notebook 代码里查找“dataset_config_name”值为“sst2”;如果你对照到 HuggingFace estimator 的 entry_point 文件(本例定义的是 run_clm.py),外面的代码是这样写的:

其代码正文里解释的很分明,列出如下,供你参考:

“获取数据集:你能够提供本人的 CSV/JSON/TXT 训练和评估文件(见下文),也能够只提供数据集 Hub 上可用的一个公共数据集的名称,网址为 https://huggingface.co/datasets/?trk=cndc-detail(该数据集将主动从数据集 Hub 下载)…”

Amazon SageMaker 训练任务设置

要创立 Amazon SageMaker 训练作业,咱们应用估算器(estimator)。咱们将在 Amazon SageMaker 训练编译器中应用 HuggingFace 估算器。应用估算器,你能够通过 entry_point 定义 Amazon SageMaker 应该应用的训练脚本、参加训练的实例类型(instance_type)、传递的超参数等。

当 Amazon SageMaker 训练作业开始时,Amazon SageMaker 负责启动和治理所有必须的机器学习实例,筛选相应的 HuggingFace 深度学习容器,上传训练脚本,而后将数据从指定的数据集所在 S3 桶(sagemaker_session_bucket)下载到 /opt/ml/input/data 的容器中。

首先,将定义一些所有估算器共有的基本参数(如果只是试验用处,倡议敞开 Amazon SageMaker Debugger 的性能剖析和调试工具,以防止额定的开销):

estimator_args = dict(
    source_dir="scripts",
    entry_point="run_clm.py",
    instance_type="ml.g4dn.12xlarge",
    instance_count=1,
    role=role,
    py_version="py38",
    volume_size=100,
    disable_profiler=True,  # Disabling SageMaker Profiler to avoid overheads during benchmarking
    debugger_hook_config=False,  # Disabling SageMaker Debugger to avoid overheads during benchmarking
    base_job_name="trcomp-pt-example",
    metric_definitions=[{"Name": "summary_train_runtime", "Regex": "'train_runtime': ([0-9.]*)"},
        {
            "Name": "summary_train_samples_per_second",
            "Regex": "'train_samples_per_second': ([0-9.]*)",
        },
        {"Name": "summary_train_steps_per_second", "Regex": "'train_steps_per_second': ([0-9.]*)"},
        {"Name": "summary_train_loss", "Regex": "'train_loss': ([0-9.]*)"},
        {"Name": "epoch", "Regex": "'epoch': ([0-9.]*)"},
        {"Name": "train_loss", "Regex": "'loss': ([0-9.]*)"},
        {"Name": "learning_rate", "Regex": "'learning_rate': ([0-9.]*)"},
    ],
)

# Since ml.g4dn.12xlarge instance has 4 GPUs, we set num_gpus_per_instance to 4
num_gpus_per_instance = 4

左滑查看更多

接下来,定义一些要传递给训练脚本的基本参数。

# Hyperparameters are passed to the training script as arguments.

hyperparameters = {
    "model_type": "gpt2",
    "tokenizer_name": "gpt2",
    "dataset_name": "glue",
    "dataset_config_name": "sst2",
    "do_train": True,
    "do_eval": False,
    "fp16": True,
    "per_device_eval_batch_size": 8,
    "num_train_epochs": 100,
    "block_size": 512,
    "overwrite_output_dir": True,
    "save_strategy": "no",
    "evaluation_strategy": "no",
    "logging_strategy": "epoch",
    "output_dir": "/opt/ml/model",
    "dataloader_drop_last": True,
}

左滑查看更多

在以下各节中,将创立估算器并开始训练。

应用原生的 PyTorch 代码进行模型训练

上面的 per_device_train_batch_size 定义了 可放入 ml.g4dn.12xlarge 实例内存中的最大批次。如果您更改模型、实例类型、序列长度或其余影响内存耗费的参数,则须要找到相应的最大批次大小。

另外,请留神该示例代码设置了 PyTorch 数据并行形式:

distribution={“pytorchddp”: {“enabled”: True}}

在 Amazon SageMaker 上设置数据并行 PyTorch 数据并行形式,就是这么不便和高效!对此感兴趣的话,能够通过以下文档链接进一步理解:

https://aws.amazon.com/cn/blogs/machine-learning/run-pytorch-…

此示例应用 HuggingFace 训练脚本 run_clm.py,你能够在脚本文件夹中找到它。

from sagemaker.pytorch import PyTorch

# The original learning rate was set for a batch of 32. Here we scale learning rate linearly with an adjusted batch size
per_device_train_batch_size = 10
global_batch_size = (per_device_train_batch_size * num_gpus_per_instance * estimator_args["instance_count"]
)
learning_rate = float("5e-5") / 32 * global_batch_size

# Configure the training job
native_estimator = PyTorch(
    framework_version="1.11",
    hyperparameters=dict(
        **hyperparameters,
        **{
            "per_device_train_batch_size": per_device_train_batch_size,
            "learning_rate": learning_rate,
        },
    ),
    distribution={"pytorchddp": {"enabled": True}},
    **estimator_args,
)

# Start the training job
native_estimator.fit(wait=False)

native_estimator.latest_training_job.name

左滑查看更多

应用编译优化的 PyTorch 代码进行模型训练

Amazon SageMaker 训练编译器(Training Compiler)的性能能够进行这些优化,以缩短 GPU 实例上的训练工夫。编译器优化 DL 模型,通过更高效地应用 SageMaker 机器学习 (ML) GPU 实例来减速训练。SageMaker Training Compiler 无需额定付费即可应用 SageMaker,它能够放慢训练速度,从而帮忙缩小总计费时间。

以下代码示例了如何 应用散布机制 pytorchxla,这是一种可辨认编译器的分布式训练方法。

通过 Amazon SageMaker 训练编译器进行编译会更改模型的内存占用。最常见的是,这体现为内存利用率升高,随之而来的是可包容 GPU 的最大批量大小减少。请留神,更改批量大小时,必须适当调整学习率。以下的代码将展现:随着批次规模的减少,咱们对学习率如何进行线性调整。

from sagemaker.huggingface import HuggingFace, TrainingCompilerConfig

# The original learning rate was set for a batch of 32. Here we scale learning rate linearly with an adjusted batch size
new_per_device_train_batch_size = 20
global_batch_size = (new_per_device_train_batch_size * num_gpus_per_instance * estimator_args["instance_count"]
)
learning_rate = float("5e-5") / 32 * global_batch_size

# Configure the training job
optimized_estimator = HuggingFace(compiler_config=TrainingCompilerConfig(),
    transformers_version="4.21",
    pytorch_version="1.11",
    hyperparameters=dict(
        **hyperparameters,
        **{
            "per_device_train_batch_size": new_per_device_train_batch_size,
            "learning_rate": learning_rate,
        },
    ),
    distribution={"pytorchxla": {"enabled": True}},
    **estimator_args,
)

# Start the training job
optimized_estimator.fit(wait=False)

optimized_estimator.latest_training_job.name

左滑查看更多

试验后果比照剖析

让咱们比拟一下应用和不应用 Amazon SageMaker 训练编译器的各种训练指标。其中包含:训练数据吞吐量比照、训练损失收敛性比照、训练耗时比照、训练老本比照等。

训练数据吞吐量

比照图

训练损失收敛性比照

训练耗时比照图

训练老本比照图

由多个维度的试验数据比照可见,Amazon SageMaker 训练编译器可进步训练吞吐量,这意味着缩小了总训练工夫。而且,总训练工夫的缩小也会导致 Amazon SageMaker 的计费秒数缩小,从而帮忙企业节俭机器学习训练所需的老本等。

试验三:应用 Amazon SageMaker 实现 BERT 模型的模型并行(Model Parallelization)训练

该入手试验的指标是应用 Amazon SageMaker 的模型并行库(Model Parallelism Library),来实现例如 BERT 这样的 LLM 模型的模型分布式并行训练。

在我之前的直播《“顶流”AIGC:从论文解读深刻探索 AIGC 和 LLM 的训练优化》中,我详细分析了训练大型语言模型(LLM)波及许多挑战,以及 Amazon SageMaker 的各项性能如何一一对应来帮忙开发者应答这些挑战。其中的挑战之一就是面对大数据和大模型是扩展性(Scaling up)。本试验将探讨和演示如何应用 Amazon SageMaker 的模型并行库(Model Parallelism Library),来实现大模型的模型分布式训练。

模型并行性是一种训练无奈包容在单个 GPU 上的大型模型的办法。如果你正在钻研从 70 亿个参数到 1750 亿个参数不等的模型,那么模型并行性就是实现这个目标的办法,这些模型太大了,不能放在单个 GPU 上。因而,咱们须要一个并行策略来利用它们。应用 Amazon SageMaker 的模型并行库,能够训练因为 GPU 内存限度而难以训练的大型语言模型。该库可主动高效地将模型拆分为多个 GPU 和实例。应用该库,开发者能够高效地训练具备数十亿或数万亿个参数的 LLM 模型,从而更快地实现目标预测精度。

  • Amazon SageMaker 的模型并行库参考文档:https://docs.aws.amazon.com/sagemaker/latest/dg/model-paralle…
  • 本试验参考代码的 GitHub 地址: https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/bert/smp_bert_tutorial.ipynb?trk=cndc-detail

试验环境和代码构造

Sagemaker 分布式模型并行 (SMP) 是一个模型并行库,用于训练大型深度学习模型,这些模型以前因为 GPU 内存限度而难以训练。SMP 可主动高效地将模型拆分为多个 GPU 和实例,并协调模型训练,容许你通过创立具备更多参数的更大模型来进步预测精度。

此 notebook 配置 SMP 应用 PyTorch 1.6.0 和 Amazon SageMaker Python SDK 训练模型。

在该 notebook 中,将在 SMP 中应用 BERT 示例训练脚本。示例脚本基于 Nvidia 深度学习示例,要求下载数据集并将其上传到 Amazon S3。这是一个大型数据集,因而依据你的连贯速度,此过程可能须要数小时能力实现。

  • Nvidia 深度学习示例 https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT?trk=cndc-detail

此 notebook 依赖于以下文件:

  1. bert_example/sagemaker_smp_pretrain.py:这是一个入口点脚本,在 notebook 指令中传递给 Pytorch 估算器。该脚本负责应用 SMP 对 BERT 模型进行端到端训练。
  2. bert_example/modeling.py:这蕴含 BERT 模型的模型定义。
  3. bert_example/bert_config.json:这容许对模型进行额定配置,由 modeling.py 应用。其余配置包含 dropout 概率、pooler 和编码器大小、编码器暗藏层的数量、编码器中间层的大小等。
  4. bert_example/schedulers.py:蕴含用于端到端训练 BERT 模型 (bert_example/sagemaker_smp_pretrain.py) 的学习率调度器(learning rate schedulers)的定义。
  5. bert_example/utils.py:它蕴含用于端到端训练 BERT 模型 (bert_example/sagemaker_smp_pretrain.py) 的不同辅助实用函数。
  6. bert_example/file_utils.py:蕴含模型定义中应用的不同文件实用程序函数 (bert_example/modeling.py)。

试验筹备和扩大学习资源

试验扩大学习资源

如果你是 Amazon SageMaker 的新用户,你可能会发现以下内容对进一步理解 SMP 和在 PyTorch 上应用 Amazon SageMaker 很有帮忙:

无关 SageMaker 模型并行度库的更多信息,请参阅 应用 SageMaker 分布式对并行分布式训练进行建模;

无关在 PyTorch 上应用 SageMaker Python SDK 的更多信息,请参阅如何 应用 PyTorch 和 SageMaker Python SDK;

理解如何应用本人的训练镜像(image)在 Amazon SageMaker 中启动训练任务,请参阅 应用本人的训练算法。

  • 应用 SageMaker 分布式对并行分布式训练进行建模:https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/model-p…
  • 应用 PyTorch 和 SageMaker Python SDK:https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch…
  • 应用本人的训练算法:https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/your-al…

试验筹备

您必须创立 S3 存储桶来存储用于训练的输出数据。此存储桶必须位于您启动训练任务的同一亚马逊云科技的海内区域中。要理解如何操作,请参阅 Amazon S3 文档中的 创立存储桶。

您必须从 Nvidia 深度学习示例 中下载用于训练的数据集并将其上传到您创立的 S3 存储桶。要具体理解为预处理和下载数据集而提供的数据集和脚本,请参阅 在 Nvidia 深度学习示例存储库 README 中获取数据。您也能够应用疾速入门指南来学习如何下载数据集。存储库由三个数据集组成。或者你也能够应用 wiki_only 参数来仅下载维基百科数据集。

  • 创立存储桶: https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABuck…
  • Nvidia 深度学习示例: https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT?trk=cndc-detail
  • 在 Nvidia 深度学习示例存储库 README 中获取数据: https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/LanguageModeling/BERT/README.md#getting-the-data?trk=cndc-detail

Amazon SageMaker 的初始化

初始化 notebook 实例。获取亚马逊云科技的区域信息、SageMaker 执行角色的亚马逊资源名称 (ARN)、以及应用的缺省 Amazon S3 桶等信息。

import sagemaker
from sagemaker import get_execution_role
from sagemaker.estimator import Estimator
from sagemaker.pytorch import PyTorch
import boto3
import os

role = (get_execution_role()
)  # provide a pre-existing role ARN as an alternative to creating a new role
print(f"SageMaker Execution Role:{role}")

client = boto3.client("sts")
account = client.get_caller_identity()["Account"]
print(f"AWS account:{account}")

session = boto3.session.Session()
region = session.region_name
print(f"AWS region:{region}")
sagemaker_session = sagemaker.session.Session(boto_session=session)
import sys

print(sys.path)

# get default bucket
default_bucket = sagemaker_session.default_bucket()
print()
print("Default bucket for this session:", default_bucket)

左滑查看更多

在 Amazon S3 中筹备训练数据

如果您还没有 BERT 数据集在 S3 存储桶中,请参阅 Nvidia BERT 示例 中的阐明,下载该数据集并将其上传到 S3 存储桶。无关详细信息,请参阅 3.2 章节的试验筹备。

替换以下“None”以设置预处理数据的 S3 存储桶和前缀。例如,如果你的训练数据在 s3://your-bucket/training 中,请设置 s3_bucket 的值为 your-bucket,设置前缀 prefix 的值为 training,作为前缀。输入数据也将存储在同一个存储桶中,位于 output/ 前缀下。

  • Nvidia BERT 示例:https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT?trk=cndc-detail
s3_bucket = None  # Replace None by your bucket
prefix = None  # Replace None by the prefix of your data

左滑查看更多

如果您持续应用 s3_bucket 和 prefix 的 None 值,则程序会从公共 S3 存储桶 sagemaker-sample-files 下载一些模仿数据并将其上传到您的默认存储桶。

if s3_bucket is None:
    # Donwload some mock data from a public bucket in us-east-1
    s3 = boto3.resource("s3")
    bucket_name = "sagemaker-sample-files"
    # Phase 1 pretraining
    prefix = "datasets/binary/bert/hdf5_lower_case_1_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5/wikicorpus_en_abstract"

    local_dir = "/tmp/data"
    bucket = s3.Bucket(bucket_name)

    for obj in bucket.objects.filter(Prefix=prefix):
        target = os.path.join(local_dir, obj.key)
        if not os.path.exists(os.path.dirname(target)):
            os.makedirs(os.path.dirname(target))
        bucket.download_file(obj.key, target)

    # upload to default bucket
    mock_data = sagemaker_session.upload_data(path=os.path.join(local_dir, prefix),
        bucket=sagemaker_session.default_bucket(),
        key_prefix=prefix,
    )

    data_channels = {"train": mock_data}
else:
    s3train = f"s3://{s3_bucket}/{prefix}"
    train = sagemaker.session.TrainingInput(s3train, distribution="FullyReplicated", s3_data_type="S3Prefix")
    data_channels = {"train": train}

左滑查看更多

而后,持续设置输入数据门路。这是存储模型工件的中央。

s3_output_location = f"s3://{default_bucket}/output/bert"
print(f"your output data will be stored in: s3://{default_bucket}/output/bert")

左滑查看更多

定义 SageMaker 训练任务

接下来,你将应用 SageMaker Estimator API 来定义 SageMaker 训练作业。

本例应用 PyTorchEstimator 来定义 Amazon SageMaker 用于训练的 EC2 实例的数量和类型,以及连贯到这些实例的卷的大小。

  • PyTorchEstimator:https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch…

须要配置的参数包含:

  • 实例数量
  • 实例类型
  • 卷的大小

在 instance_type 和 instance_count 中指定的实例类型和实例数量,将决定 Amazon SageMaker 在训练期间应用的 GPU 数量。为 instance_type 和 instance_count 指定值,这样可用于训练的 GPU 总数等于训练脚本中 smp.init 配置中的分区。

如果将 ddp 设置为 True,则必须确保可用的 GPU 总数可被分区整除。除法的后果被推断为用于 Horovod(数据并行度)的模型正本数量。

另外,还须要为 SMP 设置参数字典并设置自定义 mpioptions。

参数字典可配置的内容包含:微批次数量、分区数量、是否将数据并行与 ddp 一起应用、流水线策略、搁置策略和其余特定于 BERT 的超参数。

mpi_options = "-verbose --mca orte_base_help_aggregate 0"
smp_parameters = {
    "optimize": "speed",
    "microbatches": 12,
    "partitions": 2,
    "ddp": True,
    "pipeline": "interleaved",
    "overlapping_allreduce": True,
    "placement_strategy": "cluster",
    "memory_weight": 0.3,
}
timeout = 60 * 60
metric_definitions = [{"Name": "base_metric", "Regex": "<><><><><><>"}]

hyperparameters = {
    "input_dir": "/opt/ml/input/data/train",
    "output_dir": "./checkpoints",
    "config_file": "bert_config.json",
    "bert_model": "bert-large-uncased",
    "train_batch_size": 48,
    "max_seq_length": 128,
    "max_predictions_per_seq": 20,
    "max_steps": 7038,
    "warmup_proportion": 0.2843,
    "num_steps_per_checkpoint": 200,
    "learning_rate": 6e-3,
    "seed": 12439,
    "steps_this_run": 500,
    "allreduce_post_accumulation": 1,
    "allreduce_post_accumulation_fp16": 1,
    "do_train": 1,
    "use_sequential": 1,
    "skip_checkpoint": 1,
    "smp": 1,
    "apply_optimizer": 1,
}

左滑查看更多

以下代码将演示:如何在启用 SMP 的状况下实例化 PyTorch 估算器。

pytorch_estimator = PyTorch(
    "sagemaker_smp_pretrain.py",
    role=role,
    instance_type="ml.p3.16xlarge",
    volume_size=200,
    instance_count=1,
    sagemaker_session=sagemaker_session,
    py_version="py36",
    framework_version="1.6.0",
    distribution={"smdistributed": {"modelparallel": {"enabled": True, "parameters": smp_parameters}},
        "mpi": {
            "enabled": True,
            "processes_per_host": 8,
            "custom_mpi_options": mpi_options,
        },
    },
    source_dir="bert_example",
    output_path=s3_output_location,
    max_run=timeout,
    hyperparameters=hyperparameters,
    metric_definitions=metric_definitions,
)

左滑查看更多

最初,你将应用这个估算器启动 SageMaker 训练作业,如下代码所示:

pytorch_estimator.fit(data_channels, logs=True)

左滑查看更多

本期文章,咱们重点探讨了大型语言模型(LLMs)在亚马逊云科技上的入手实际,解读和演示大型语言模型(LLMs),如何联合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等方面的一些理论例子及实现代码,心愿这些例子和实现代码对于正在摸索 LLMs 精彩世界的你,会有所启发和帮忙。

下一期内容将开始摸索 Generative AI 新世界的另一个重要方向:文生图(Text-to-Image)方向。我打算用接下来的三期内容,别离探讨文生图(Text-to-Image)方向的起源和概述、文生图(Text-to-Image)方向的次要论文解读,以及文生图(Text-to-Image)方向在亚马逊云科技上的落地实际和解决方案分享。敬请期待。

请继续关注 Build On Cloud 微信公众号,理解更多面向开发者的技术分享和云开发动静!

往期举荐

机器学习洞察

架构模型最佳实际

GitOps 最佳实际

作者黄浩文
亚马逊云科技资深开发者布道师,专一于 AI/ML、Data Science 等。领有 20 多年电信、挪动互联网以及云计算等行业架构设计、技术及守业治理等丰盛教训,曾就任于 Microsoft、Sun Microsystems、中国电信等企业,专一为游戏、电商、媒体和广告等企业客户提供 AI/ML、数据分析和企业数字化转型等解决方案咨询服务。

文章起源:https://dev.amazoncloud.cn/column/article/6454e7f282781d3c03b…

正文完
 0