乐趣区

关于ml:Amazon-SageMaker新玩法定制你的语音识别模型

前言

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

本文会为大家展现如何 应用 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 /fsx
2
3ln -s /fsx /home/ec2-user/SageMaker/fsx
4
5cd ~/SageMaker/fsx
6
7git 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:latest
2ENV DEBIAN_FRONTEND=noninteractive
3ENV PATH /opt/conda/bin:$PATH
4
5RUN 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 -afy
19
20COPY ./requirements.txt /tmp/
21
22RUN 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 boto3
2account_id = boto3.client('sts').get_caller_identity().get('Account')
3region = boto3.Session().region_name
4ecr_repository = 'sagemaker-wenet'
5
6# 登录 ECR 服务
7!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com
8
9# 训练镜像
10training_docker_file_path = '/fsx/wenet'
11!cat $training_docker_file_path/Dockerfile
12
13tag = ':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)
16
17!cd $training_docker_file_path && docker build -t "$ecr_repository$tag" .
18!docker tag {ecr_repository + tag} $training_repository_uri
19!docker push $training_repository_uri
20Python

应用 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/33
3Bash

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

1sh-4.2$ ls /fsx/asr-data/OpenSLR/33
2data_aishell  data_aishell.tgz  resource_aishell  resource_aishell.tgz
3Bash

数据预处理

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

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

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

1from sagemaker.inputs import FileSystemInput
2from sagemaker.pytorch.estimator import PyTorch
3
4file_system_id = 'fs-0f8a3xxxxf47b6ff8'
5file_system_path = '/yobzhbmv'
6file_system_access_mode = 'rw'
7file_system_type = 'FSxLustre'
8
9security_group_ids = ['sg-04acfcxxxx929ee4e']
10subnets= ['subnet-07ce0abxxxxcfeb25']
11
12file_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}
7
8estimator=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,
16
17    subnets=subnets,
18    security_group_ids=security_group_ids,
19
20    debugger_hook_config=False,
21    disable_profiler=True
22)
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 = 1
3CUDA_VISIBLE_DEVICES='0'
4
5hp= {
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_count
10}
11
12estimator=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,
20
21    subnets=subnets,
22    security_group_ids=security_group_ids,
23
24    debugger_hook_config=False,
25    disable_profiler=True
26)
27
28
29estimator.fit({'train': 'file:///fsx'})
30Python

代码的输入如下:

1Creating 2n0im72bz3-algo-1-tpyyu ... 
2Creating 2n0im72bz3-algo-1-tpyyu ... done
3Attaching to 2n0im72bz3-algo-1-tpyyu
4…
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 train
8…
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.pt
102n0im72bz3-algo-1-tpyyu | algo-1-tpyyu: 2021-06-24 15:50:09,669 INFO     [train.py:228] Epoch 0 TRAIN info lr 8e-08
112n0im72bz3-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 before
122n0im72bz3-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/tmp6y009akq
2/tmp/tmp6y009akq
3├── artifacts
4├── docker-compose.yaml
5├── model
6└── output
7    └── data
8Bash

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

1sh-4.2$ cat /tmp/tmp6y009akq/docker-compose.yaml 
2networks:
3  sagemaker-local:
4    name: sagemaker-local
5services:
6  algo-1-tpyyu:
7    command: train
8    container_name: 2n0im72bz3-algo-1-tpyyu
9    environment:
10    - AWS_REGION=us-east-1
11    - TRAINING_JOB_NAME=sagemaker-wenet-2021-06-24-15-49-58-018
12    image: <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/sagemaker-wenet:training-pip-pt181-py38
13    networks:
14      sagemaker-local:
15        aliases:
16        - algo-1-tpyyu
17    stdin_open: true
18    tty: true
19    volumes:
20    - /tmp/tmp6y009akq/algo-1-tpyyu/output:/opt/ml/output
21    - /tmp/tmp6y009akq/algo-1-tpyyu/output/data:/opt/ml/output/data
22    - /tmp/tmp6y009akq/algo-1-tpyyu/input:/opt/ml/input
23    - /tmp/tmp6y009akq/model:/opt/ml/model
24    - /opt/ml/metadata:/opt/ml/metadata
25    - /fsx:/opt/ml/input/data/train
26version: '2.3'
27Bash

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

托管训练模式

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

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

训练代码如下:

1instance_type='ml.p3.8xlarge'
2instance_count = 2
3CUDA_VISIBLE_DEVICES='0,1,2,3'
4
5hp= {
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_count
11}
12
13estimator=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,
21
22    subnets=subnets,
23    security_group_ids=security_group_ids,
24
25    debugger_hook_config=False,
26    disable_profiler=True,
27    environment={
28        'NCCL_SOCKET_IFNAME': 'eth0',
29        'NCCL_IB_DISABLE': 1
30    }
31)
32
33estimator.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}
7
8estimator=PyTorch(
9…
10)
11
12estimator.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…

本篇作者


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

退出移动版