前言

通过语音形式与机器进行交互能够在很多场景下提高效率,也是当下人工智能畛域内钻研的热点之一。语音辨认技术的利用场景能够划分为以车载语音助手为例的车载场景、以智能家居设施的家庭场景等。要实现人与机器间的语音交互,须要首先让机器可能辨认声音内容,但通用的语音辨认服务无奈齐全满足不同场景下的需要,因而客户须要依据本人的需要训练模型。

本文会为大家展现如何应用Amazon SageMaker服务训练本人的语音辨认模型,咱们抉择了一个开源的语音辨认我的项目WeNet作为示例。

Amazon SageMaker是一项齐全托管的机器学习服务,涵盖了数据标记、数据处理、模型训练、超参调优、模型部署及继续模型监控等根本流程;也提供主动打标签,主动机器学习,监控模型训练等高阶性能。其通过全托管的机器学习基础设施和对支流框架的反对,能够升高客户机器学习的整体领有老本。

WeNet是一个面向工业级产品的开源端到端语音辨认解决方案,同时反对流式及非流式辨认,并能高效运行于云端及嵌入式端。模型在训练的过程中,须要用到大量的计算资源,咱们能够借助Amazon SageMaker十分不便的启动蕴含多台齐全托管的训练实例集群,减速训练过程。

想要理解更多亚马逊云科技最新技术公布和实际翻新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~

筹备工作

在开始训练模型之前,咱们须要做一些筹备工作,包含筹备FSx文件系统以寄存训练过程中的数据、创立Amazon SageMaker Notebook作为试验环境、在笔记本中挂载FSx文件系统、筹备试验代码,以及筹备数据处理及模型训练的运行环境(Docker镜像)并把镜像推送到Amazon ECR(Elastic Container Registry)中。

本文中的试验内容均应用us-east-1区域中的服务实现,您能够自行应用其余区域。

创立FSx for Lustre存储

以往,在Amazon SageMaker中训练模型个别应用Amazon Simple Storage Service(Amazon S3)作为存储,当初,Amazon SageMaker做模型训练时曾经反对多种数据源,比方Amazon FSx for Lustre和Amazon Elastic File System (EFS)。Amazon SageMaker通过间接读取存储在EFS或者FSx for Luster上的数据来放慢训练模型时数据加载进度。

FSx for Lustre反对从Amazon S3中导入数据,以及将数据导出到Amazon S3,如果您的数据曾经寄存在Amazon S3中,FSx for Lustre以通明形式将对象显示为文件。同一个FSx文件系统还可用于多个Amazon SageMaker训练任务,省去多次重复下载训练数据集的工夫。

这里,咱们会抉择应用FSx for Lustre作为次要的数据存储。接下来,咱们会创立一个FSx for Lustre存储。

创立基于Amazon S3的FSx for Lustre

在“网络和安全性”处设置VPC,子网组和平安组,并确认平安组入站规定是否容许了端口998的流量。

在“数据存储库导入/导出”处抉择“ 从Amazon S3导入数据及将数据导出到Amazon S3”并指定Amazon S3训练数据所在的存储桶和门路。

创立实现后,点击“挂载”按钮就会弹出挂载此文件系统的步骤,稍后咱们会在Amazon SageMaker Notebook中应用到。

创立Amazon SageMaker Notebook

抉择笔记本实例类型,这里咱们抉择一台ml.p3.8xlarge的机器,其蕴含4张Tesla V100 GPU卡。您能够抉择其余GPU机器,如果您不须要GPU卡,也能够抉择CPU机器。

此外,您能够自行决定笔记本实例的卷大小,如本实例抉择了100GB的存储。您能够在后续调整此存储的大小。

抉择新建IAM角色,蕴含所需的权限,如下图:

网络局部,抉择FSx所在VPC以及私有子网即可,平安组须要容许Amazon SageMaker拜访FSx。

在笔记本中挂载FSx存储

在笔记本控制台页面,点击“关上JupyterLab”。

在Launcher页面,点击“Terminal”以创立一个新的命令行终端。依据“创立基于Amazon S3的FSx”章节中提醒的步骤,在命令终端中装置Lustre客户端,并执行挂载命令。

此外,您还能够配置笔记本生命周期策略,在创立或者启动Notebook实例的时候,实现笔记本主动挂载FSx文件系统,参考文档[2]。

下载WeNet源代码

在上一步中的命令行终端,执行如下命令,将实现代码下载。

1sudo chown ec2-user.ec2-user /fsx23ln -s /fsx /home/ec2-user/SageMaker/fsx45cd ~/SageMaker/fsx67git clone -b sagemaker https://github.com/chen188/wenet

这里,咱们建议您将试验相干文件都搁置在~/Amazon SageMaker目录下,该目录下的数据在Notebook实例关机之后仍然能够独自存在。

您能够关上Notebook文件
/fsx/wenet/examples/aishell/s0/SM-WeNet.ipynb,
后续的命令您都能够在此笔记本中找到。

筹备Docker 镜像

在Amazon SageMaker中,很多工作都是基于Docker 镜像实现,如数据预处理、模型训练及模型托管等。采纳Docker镜像能够极大水平保障环境的一致性,并且升高环境预置的运维老本。

接下来,咱们会须要构建本人的Docker镜像,来实现数据格式转换、模型训练。Amazon Web Service曾经提供了一些通用的Deep Learning Container(DLC)环境,具体列表能够参考[6]。然而其中尚未蕴含TorchAudio包,此时,咱们能够抉择基于开源版本构建运行环境。

该镜像基于Ubuntu来构建,并装置pytorch 1.8.1、torchaudio及其他相干依赖。

文件/fsx/wenet/Dockerfile:

1FROM ubuntu:latest2ENV DEBIAN_FRONTEND=noninteractive3ENV PATH /opt/conda/bin:$PATH45RUN apt-get update --fix-missing && \6    apt-get install -y gcc net-tools && \7    apt-get install -y --no-install-recommends wget bzip2 ca-certificates libglib2.0-0 libxext6 libsm6 libxrender1 git mercurial subversion && \8    apt-get clean && \9    rm -rf /var/lib/apt/lists/* && \10    wget --quiet https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh -O ~/anaconda.sh && \11    /bin/bash ~/anaconda.sh -b -p /opt/conda && \12    rm ~/anaconda.sh && \13    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \14    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \15    echo "conda activate base" >> ~/.bashrc && \16    find /opt/conda/ -follow -type f -name '*.a' -delete && \17    find /opt/conda/ -follow -type f -name '*.js.map' -delete && \18    /opt/conda/bin/conda clean -afy1920COPY ./requirements.txt /tmp/2122RUN pip install -r /tmp/requirements.txt && \23    pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html && \24    pip install sagemaker-training && \25rm /tmp/requirements.txt

您能够留神到,咱们额定装置了Amazon SageMaker-training包,来提供镜像对Amazon SageMaker训练性能的反对。

构建镜像并推送到ECR

ECR是Amazon齐全托管的容器注册表服务,咱们能够将构建好的镜像推送到ECR,后续Amazon SageMaker在训练或者托管模型的时候,会从这里下载对应的镜像。

1import boto32account_id = boto3.client('sts').get_caller_identity().get('Account')3region = boto3.Session().region_name4ecr_repository = 'sagemaker-wenet'56# 登录ECR服务7!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com89# 训练镜像10training_docker_file_path = '/fsx/wenet'11!cat $training_docker_file_path/Dockerfile1213tag = ':training-pip-pt181-py38'14training_repository_uri = '{}.dkr.ecr.{}.amazonaws.com/{}'.format(account_id, region, ecr_repository + tag)15print('training_repository_uri: ', training_repository_uri)1617!cd $training_docker_file_path && docker build -t "$ecr_repository$tag" .18!docker tag {ecr_repository + tag} $training_repository_uri19!docker push $training_repository_uri20Python

应用Amazon SageMaker训练模型

当初,咱们曾经实现试验环境筹备工作,接下来,咱们就进入正题,利用Amazon SageMaker实现模型训练工作

WeNet反对训练多种模型,如Conformer、Transformer等,这里咱们会以unified transformer为例展现整个训练流程。对于训练数据,WeNet同样反对多种起源,只须要在训练的时候,依照格局整顿数据即可,如AIShell-1、AIShell-2及LibriSpeech等,这里,咱们会以AIShell-1为例。

  • 格局
    https://wenet-e2e.github.io/w...

数据下载

咱们首先须要将训练数据下载到本地FSx存储中,在notebook中执行命令:

1cd /fsx/wenet/examples/aishell/s0 && \2bash run.sh --stage -1 --stop_stage -1 --data /fsx/asr-data/OpenSLR/333Bash

数据会主动被下载到/fsx/asr-data/OpenSLR/33目录中,下载实现后的状态为:

1sh-4.2$ ls /fsx/asr-data/OpenSLR/332data_aishell  data_aishell.tgz  resource_aishell  resource_aishell.tgz3Bash

数据预处理

接下来,咱们须要将数据整顿为WeNet所需的格局。这里咱们借助Amazon SageMaker来执行数据预处理的逻辑。

挂载FSx文件系统到数据预处理容器

在后面咱们提到,模型训练所需的数据曾经寄存在FSx文件系统中,咱们在通过Amazon SageMaker解决数据的时候,须要把此FSx文件系统挂载到容器里。挂载文件系统的代码如下:

1from sagemaker.inputs import FileSystemInput2from sagemaker.pytorch.estimator import PyTorch34file_system_id = 'fs-0f8a3xxxxf47b6ff8'5file_system_path = '/yobzhbmv'6file_system_access_mode = 'rw'7file_system_type = 'FSxLustre'89security_group_ids = ['sg-04acfcxxxx929ee4e']10subnets= ['subnet-07ce0abxxxxcfeb25']1112file_system_input_train = FileSystemInput(file_system_id=file_system_id,13                                  file_system_type=file_system_type,14                                  directory_path=file_system_path,15                                  file_system_access_mode=file_system_access_mode)16Python

须要留神,subnets参数中指定的子网,须要有拜访Amazon S3等服务的能力,您能够抉择应用公有子网,并为子网指定到NAT网关的默认路由。

security_group_ids指定的平安组会被绑定到Amazon SageMaker启动的实例上,须要有拜访FSx服务的能力。

启动数据预处理作业

至此,咱们通过指定文件系统的id、文件系统的门路、读写模式等信息,定义好了须要挂载的文件系统。接下来,就能够设置数据处理的时候,运行环境及须要传递的参数信息。代码如下:

1hp= {2    'stage': 0, 'stop_stage': 3, 'train_set':'train', 3    'trail_dir':'/opt/ml/input/data/train/sm-train/trail0', 4    'data': '/opt/ml/input/data/train/asr-data/OpenSLR/33',5    'shared_dir': '/opt/ml/input/data/train/shared'6}78estimator=PyTorch(9    entry_point='examples/aishell/s0/sm-run.sh',10    image_uri=training_repository_uri,11    instance_type='ml.c5.xlarge',12    instance_count=1,13    source_dir='.',14    role=role,15    hyperparameters=hp,1617    subnets=subnets,18    security_group_ids=security_group_ids,1920    debugger_hook_config=False,21    disable_profiler=True22)23Python

咱们通过image_uri参数指定数据处理代码运行的容器环境,instance_type指定须要的实例类型,instance_count指定须要的实例数量,hyperparameters指定须要传递的超参数。

接下来,就能够通过一行命令启动指定的计算资源,并执行数据处理逻辑。

1estimator.fit(inputs={'train': file_system_input_train})2Python

咱们通过inputs参数设置了容器运行时的数据输出信息,Amazon SageMaker反对多种数据起源,如本地文件(file://),Amazon S3门路(s3://bucket/path)及文件系统(FSx或者EFS)。这里,咱们的FSx文件系统会被映射到容器的 /opt/ml/input/data/train 目录下,train为自定义的channel名称,其余常见的channel包含test,validation等。Amazon SageMaker中具体的门路映射规定能够参考[1]。

查看解决后的数据

解决实现之后,会在trail_dir及shared_dir目录下创立对应的文件。在Notebook实例上执行命令,具体如下:

tree -L 3 /fsx/sm-train/trail0

tree -L 3 /fsx/sm-train/shared

启动模型训练作业

至此,咱们曾经筹备好了训练数据。接下来,咱们就能够进入模型训练阶段了。咱们会展现本地训练全托管实例训练两种训练模式。

本地训练模式

在模型研发过程中,算法人员须要重复调整代码逻辑,如果每次代码调整就打包一个docker镜像就显得很麻烦,因而,您能够先通过Amazon SageMaker的本地训练模式,来调试代码。本地训练模式会间接在Notebook所在实例中启动对应的容器并执行训练逻辑,并主动将数据映射给容器。无关本地模式训练的细节,能够参考文档[3],这里咱们应用的本地训练代码如下:

1instance_type='local_gpu'2instance_count = 13CUDA_VISIBLE_DEVICES='0'45hp= {6    'stage': 4, 'stop_stage': 4, 'train_set':'train', 7    'data': data_dir, 'trail_dir': trail_dir, 'shared_dir': shared_dir,8    'CUDA_VISIBLE_DEVICES': CUDA_VISIBLE_DEVICES, 9    'num_nodes': instance_count10}1112estimator=PyTorch( 13    entry_point='examples/aishell/s0/sm-run.sh',14    image_uri=training_repository_uri,15    instance_type =instance_type,16    instance_count=instance_count,17    source_dir='.',18    role=role,19    hyperparameters=hp,2021    subnets=subnets,22    security_group_ids=security_group_ids,2324    debugger_hook_config=False,25    disable_profiler=True26)272829estimator.fit({'train': 'file:///fsx'})30Python

代码的输入如下:

1Creating 2n0im72bz3-algo-1-tpyyu ... 2Creating 2n0im72bz3-algo-1-tpyyu ... done3Attaching to 2n0im72bz3-algo-1-tpyyu4…52n0im72bz3-algo-1-tpyyu | Invoking script with the following command:62n0im72bz3-algo-1-tpyyu | 72n0im72bz3-algo-1-tpyyu | /bin/sh -c ./examples/aishell/s0/sm-run.sh --CUDA_VISIBLE_DEVICES 0 --data /opt/ml/input/data/train/asr-data/OpenSLR/33 --num_nodes 1 --shared_dir /opt/ml/input/data/train/sm-train/shared --stage 4 --stop_stage 4 --trail_dir /opt/ml/input/data/train/sm-train/trail0 --train_set train8…92n0im72bz3-algo-1-tpyyu | algo-1-tpyyu: 2021-06-24 15:50:09,408 INFO     [checkpoint.py:33] Checkpoint: save to checkpoint /opt/ml/input/data/train/sm-train/trail0/exp/unified_transformer/init.pt102n0im72bz3-algo-1-tpyyu | algo-1-tpyyu: 2021-06-24 15:50:09,669 INFO     [train.py:228] Epoch 0 TRAIN info lr 8e-08112n0im72bz3-algo-1-tpyyu | algo-1-tpyyu: 2021-06-24 15:50:09,670 INFO     [executor.py:32] using accumulate grad, new batch size is 1 timeslarger than before122n0im72bz3-algo-1-tpyyu | algo-1-tpyyu: 2021-06-24 15:50:12,560 DEBUG    [executor.py:103] TRAIN Batch 0/7507 loss 417.150146 loss_att 148.725983 loss_ctc 1043.473145 lr 0.00000008 rank 0Python

上述参数中,source_dir指定的门路会被打包上传到Amazon S3,而后,下载到容器实例中。这样的话,咱们每次的代码变更都能够间接体现在容器中。

此外,在应用本地训练模式时,Amazon SageMaker会借助本地的docker-compose启动对应的训练任务,您能够在/tmp目录下找到相干的docker-compose文件,

如/tmp/tmp6y009akq,咱们能够察看到如下内容:

1sh-4.2$ tree /tmp/tmp6y009akq2/tmp/tmp6y009akq3├── artifacts4├── docker-compose.yaml5├── model6└── output7    └── data8Bash

其中,docker-compose.yaml蕴含了相干的配置信息,内容如下:

1sh-4.2$ cat /tmp/tmp6y009akq/docker-compose.yaml 2networks:3  sagemaker-local:4    name: sagemaker-local5services:6  algo-1-tpyyu:7    command: train8    container_name: 2n0im72bz3-algo-1-tpyyu9    environment:10    - AWS_REGION=us-east-111    - TRAINING_JOB_NAME=sagemaker-wenet-2021-06-24-15-49-58-01812    image: <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/sagemaker-wenet:training-pip-pt181-py3813    networks:14      sagemaker-local:15        aliases:16        - algo-1-tpyyu17    stdin_open: true18    tty: true19    volumes:20    - /tmp/tmp6y009akq/algo-1-tpyyu/output:/opt/ml/output21    - /tmp/tmp6y009akq/algo-1-tpyyu/output/data:/opt/ml/output/data22    - /tmp/tmp6y009akq/algo-1-tpyyu/input:/opt/ml/input23    - /tmp/tmp6y009akq/model:/opt/ml/model24    - /opt/ml/metadata:/opt/ml/metadata25    - /fsx:/opt/ml/input/data/train26version: '2.3'27Bash

能够看到,docker-compose通过volumes参数,将本地的门路映射为容器里的目录,而不须要执行训练数据的二次复制。

托管训练模式

在确定代码逻辑无误后,咱们能够很容易通过批改参数的形式,应用托管的实例开启真正的训练任务。

这里,咱们只须要调整实例类型、须要的实例数量及数据输出形式。咱们以2台ml.p3.8xlarge的实例为例,其各自蕴含4张Tesla V100显卡,共8张显卡。

训练代码如下:

1instance_type='ml.p3.8xlarge'2instance_count = 23CUDA_VISIBLE_DEVICES='0,1,2,3'45hp= {6    'stage': 4, 'stop_stage': 4, 'train_set':'train', 7    'data': data_dir, 'trail_dir': trail_dir, 'shared_dir': shared_dir,8    'CUDA_VISIBLE_DEVICES': CUDA_VISIBLE_DEVICES, 9    'ddp_init_protocol': 'tcp',10    'num_nodes': instance_count11}1213estimator=PyTorch( 14    entry_point='examples/aishell/s0/sm-run.sh',15    image_uri=training_repository_uri,16    instance_type =instance_type,17    instance_count=instance_count,18    source_dir='.',19    role=role,20    hyperparameters=hp,2122    subnets=subnets,23    security_group_ids=security_group_ids,2425    debugger_hook_config=False,26    disable_profiler=True,27    environment={28        'NCCL_SOCKET_IFNAME': 'eth0',29        'NCCL_IB_DISABLE': 130    }31)3233estimator.fit(inputs={'train': file_system_input_train})34Python

其中,参数CUDA_VISIBLE_DEVICES需设定为训练实例的GPU卡数量。如果仅有一张GPU显卡,则其值为’0’。

这里须要留神的是,撰写本文时,Amazon SageMaker训练任务在挂载FSx时,还不反对指定挂载选项flock,导致无奈应用基于file的分布式初始化办法。因而,咱们简略调整WeNet的训练代码,转而应用基于TCP的初始化办法,来持续模型训练。

您还能够察看到,咱们传入了environment参数,其示意设定容器中对应的环境变量。因为Amazon SageMaker拉起的训练实例会蕴含不止一个网卡,因而,咱们须要通过NCCL_SOCKET_IFNAME环境变量,将NCCL应用的网卡设定为eth0。

此外,Amazon SageMaker反对应用竞价实例来训练模型,以无效降低成本,您能够参考文档[4]查看应用办法。

模型文件

在训练实现之后,会在您设定的目录生成对应的模型文件,本文为/fsx/sm-train/trail0/exp/unified_transformer目录。

如果您须要导出反对序列化和优化的(TorchScript)模型,则能够调整hp变量中的stage及stop_stage,通过本地模式执行训练代码即可。无关TorchScript,能够参考[5]。

相干代码逻辑如下:

1instance_type='local_gpu'2…3hp= {4    'stage': 5, 'stop_stage': 6, 'train_set':'train', 5…6}78estimator=PyTorch(9…10)1112estimator.fit({'train':'file:///fsx'})13Python

执行实现之后,会在上述目录生成对应的模型文件final.zip及量化模型final_quant.zip文件。

当初,咱们曾经实现了一次模型训练工作。咱们晓得,想要失去一个满足当下需要的模型,须要经验屡次试验,屡次迭代及训练。您能够通过上述办法,在Amazon SageMaker上疾速尝试不同的超参数或者其余的算法,而无需思考如何配置机器学习的根底环境等运维相干工作。

模型托管

至此,咱们曾经失去了训练好的模型文件。您能够通过Amazon SageMaker部署模型,也能够通过其余形式部署。在后续的文章中,咱们会具体介绍如何在Amazon Web Services部署训练好的模型。

总结

本文展现了应用Amazon SageMaker运行开源端到端语音辨认模型WeNet的办法,涵盖数据处理、Docker运行环境构建、模型训练等内容。

参考资料

[1] Amazon SageMaker Toolkits:
https://docs.aws.amazon.com/s...

[2] 笔记本主动挂载FSx文件系统:
https://github.com/aws-sample...

[3] 应用本地模式训练模型:
https://sagemaker.readthedocs...

[4] 应用Spot模式训练模型:
https://docs.aws.amazon.com/s...

[5] TorchScript compiler:
https://pytorch.org/docs/1.8....

[6] DLC列表:
https://github.com/aws/deep-l...

本篇作者


陈斌
亚马逊云科技解决方案架构师
负责基于亚马逊云科技云计算计划的架构征询与设计,具备丰盛的解决客户理论问题的教训,目前关注深度学习的钻研与利用。