简要说明

训练一个 ML 模型有时需要复杂的设置和复制:

- 可能需要使用一些代码,这些代码托管在虚拟机的笔记本电脑上,您必须手动启动这些代码,并在完成后将其关闭。
- 每次再次训练时,您可能需要上传训练 dataset
- 当您想更改一个参数时,您需要深入研究您的代码
- 等等.

在本文中,我们将了解如何利用谷歌云人工智能平台实现FastAI文本分类器训练过程的自动化。.

在第二篇文章中,我们将介绍如何利用 AI Platform 和 TorchServe 部署此类模型。.

您可以在我们的 Medium 博客上找到更多关于我们和我们项目的信息

Blog Medium by Artefact

为了谁?

如果您正在进行一个需要多次训练 ML 模型的项目,并且厌倦了手动运行训练,那么您来对地方了。.

如果你厌倦了为培训管理虚拟机,只想把时间花在更有趣的事情上,比如阅读 Medium 上的文章,那你就来对地方了!

本文旨在介绍如何通过使用 AI Platform 训练 ML 模型来节省时间和资源。在本文中,我们将看到如何将其应用到我们的一个项目中,使用 FastAI.

本文旨在介绍如何通过使用 AI Platform 训练 ML 模型来节省时间和资源。在本文中,我们将看到如何将其应用到我们的一个项目中,使用 FastAI.

如果您想重现我们的工作,前提条件是

人工智能平台是谷歌云平台套件的一部分,我们还使用了其他服务来实现训练管道的自动化。以下是我们使用的 GCP 服务:

  • 人工智能平台,用于主持模型训练

  • 云存储,用于存放训练所需的文件以及训练后将导出的模型文件

  • 云注册中心,用于托管包含培训代码的 Docker 映像

  • (可选)计算引擎,用于在配备 GPU 的虚拟机上构建和运行 Docker 映像

谷歌云 SDK、Docker 和 Nvidia-docker 需要在构建 Docker 镜像的机器上安装和设置。安装 Nvidia-docker 的目的是在机器的 GPU(如果有的话)上直接运行构建的 Docker 镜像,以确保代码中没有错误,并确保在人工智能平台上运行时,训练能按预期运行。.

正如我们稍后将看到的,Docker 镜像是根据 Nvidia-Cuda docker 镜像创建的,因此在构建镜像时会自动安装所需的 Nvidia 驱动程序。.

背景

在本文中,我们将看到如何利用 FastAI 自动训练文本分类器。FastAI 是一个允许用户利用 ULM FiT 方法创建强大模型的库。.

Example of classification and ULM FiT Workflow

我们已经在 另一篇 Medium 文章, 因此,如果您想了解更多信息,我邀请您去看看。.

由于我们在本文中看到的内容适用于任何框架,因此您不必熟悉 FastAI 也可以继续阅读。您只需知道,除了训练标记的 dataset 之外,我们还使用了一个预训练模型来训练文本分类器。.

我们如何利用 AIPlatform 进行培训

要使用 AI Platform 自动训练模型,您需要在调用训练命令时指定哪些代码应在哪些环境中运行。最好的办法是创建一个包含所有训练代码及其环境的 Docker 镜像,这样每次要求 AI Platform 训练模型时,它只需从该镜像中创建一个容器即可。我们将在本部分了解我们是如何做到这一点的。.

将所有必要文件存储在 GCS 文件桶中

在创建包含训练内容的 Docker 镜像之前,我们必须考虑在训练 FastAI 文本分类器模型时会用到的文件。因此,我们决定将训练所需的所有文件存储在一个 GCS 文件桶中,按语言分隔成不同的文件夹,并为每个文件命名。.

然后,我们在训练代码中实现了一种方法(如下所示),只需指定目标语言作为参数,就能从 GCS 中检索到这些所需的文件。.

Architecture of our GCS bucket

编写培训代码

在 GCS 中上传必要的文件后,我们创建了一个 repo 包含模型训练的代码,稍后将存储在 Docker Image 中。.

正如您在所链接的软件仓库中看到的,我们将训练代码分成了不同的文件,以正确处理所有训练流水线。.

Execution of the training workflow

我们定义了一个执行所有训练工作流程的文件,如下所示:

  • 调用 args_getter.py 中的 get_args()方法,读取用户指定的参数

  • 调用 FastAI 训练函数并检索本地保存的训练模型

  • 将训练好的模型连同以 .json 格式存储的模型性能上传到 GCS

fastai_train.py 是唯一直接使用 FastAI 方法的文件,因此如果有人想在训练中部署其他框架,只需修改该文件(当然还有配置文件的内容)即可。.

下一步是创建一个 docker 映像,其中包含正确运行培训所需的一切。.

创建 Dockerfile

准备好训练代码后,需要创建一个 Dockerfile,并将其推送到谷歌容器注册中心,以便人工智能平台在正确的环境中检索和执行。.

由于模型的训练需要在 GPU 上运行,我们导入了 Nvidia-cuda Docker 镜像来创建自己的模型,因此已经安装了所有必要的驱动程序。.

# Dockerfile
FROM nvidia/cuda:10.2-devel

运行 apt-get update && apt-get install -y --no-install-recommends
    wget
    构建必备

运行 apt-get update && apt-get install -y --no-install-recommends
    python3-dev
    python3-setuptools
    python3-pip

运行 pip3 install pip==20.3.1

工作目录 /root

# 创建包含代码和从 GCS 下载的模型的目录
运行 mkdir /root/trainer

运行 mkdir /root/models

# 复制要求
COPY requirements.txt /root/requirements.txt

# 安装 pytorch
运行 pip3 install torch==1.8.0

# 安装 requirements
运行 pip3 install -r requirements.txt

# 安装 google cloud sdk,主要用于使用 gsutil 导出模型。
运行 wget -nv
    https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz &&
    mkdir /root/tools &&
    tar xvzf google-cloud-sdk.tar.gz -C /root/tools &&
    rm google-cloud-sdk.tar.gz &&
    /root/tools/google-cloud-sdk/install.sh --usage-reporting=false
        -path-update=false --bash-completion=false
        --禁用安装选项 &&
    rm -rf /root/.config/* &&
    ln -s /root/.config /config &&
    # 删除 gcloud 创建的备份目录
    rm -rf /root/tools/google-cloud-sdk/.install/.backup

# 复制文件
COPY trainer/fastai_train.py /root/trainer/fastai_train.py

COPY trainer/fastai_config.py /root/trainer/fastai_config.py

COPY trainer/args_getter.py /root/trainer/args_getter.py

COPY trainer/gcs_utils.py /root/trainer/gcs_utils.py

COPY trainer/training_workflow.py /root/trainer/training_workflow.py

# 路径配置
ENV PATH $PATH:/root/tools/google-cloud-sdk/bin

# 确保 gsutil 使用默认服务账户
RUN echo '[GoogleCompute]nservice_account = default' > /etc/boto.cfg

# 验证 GCP
CMD gcloud auth login

# 设置调用训练器的入口点。
ENTRYPOINT ["python3", "trainer/training_workflow.py"] (中文)

如上图所示,Dockerfile 会执行以下步骤来创建镜像:

  • 首先,导入 Nvidia docker 映像来创建训练映像

  • 然后,执行设置环境的基本命令,并下载 python 和 pip

  • 复制需求文件

  • 在安装需求之前,需要先安装 pytorch(以避免在环境中检测不到火炬时,FastAI 安装了错误版本的火炬而导致出错)。根据使用的 cuda 映像选择 pytorch 的相应版本非常重要。要知道使用哪个版本,请查看 pytorch.org

  • 完成这些步骤后,需求和 Google Cloud SDK 即完成安装,其他 python 文件也已复制到映像中。.

  • 指定默认用于验证 GCP 的服务帐户。.

  • 最后,调用 training_workflow.py 运行模型训练。.

创建图像并将其推送至 GCR

创建 Dockerfile 后,需要构建镜像并将其推送到 GCR。正如软件仓库中指定的那样,需要定义各种本地变量,例如 IMAGE_URI 在 GCR 中 地区 等。.

图像是通过运行此命令生成的:

docker build -f Dockerfile -t $IMAGE_URI .//

在将其推送到 GCR 之前,我们想确保在调用训练时一切正常,因此,由于我们的虚拟机有 GPU 可用,我们在推送之前运行了镜像,看看会发生什么:

docker run --runtime=nvidia $IMAGE_URI --epochs 1 --bucket-name $BUCKET_NAME

这一步不是必须的,但可以节省您很多时间,因为您可以直接看到代码中是否有错误。.

最后,我们运行以下命令将容器推送到 GCR、, $image_uri 是指在 GCR 中存储图像的 URI 的变量:

docker push $IMAGE_URI

运行并跟踪工作

完成前面的步骤后,只需在终端下达一个简单的命令,就可以调用模型的训练了。只需启用 Google Cloud SDK 并定义本地变量即可:

gcloud ai-platform 工作提交培训 $JOB_NAME
--扩展级 BASIC_GPU
--区域 $REGION
--master-image-uri $IMAGE_URI
--
--lang=法语
--epochs=10次
--bucket-name=$BUCKET_NAME
--model-dir=$MODEL_DIR

该命令要求 AI Platform 使用 IMAGE_URI 在 GCR 中检索容器,然后在区域 REGION 中托管的机器的 GPU 上运行训练。.

我们在这里指定了各种参数,例如训练语言、epochs 数量、在 GCS 中上传和下载文件的桶名,以及存储训练模型的目录。这些参数将由 args_getter.py 文件获取

运行命令后,训练开始,并在人工智能平台控制台中创建了一个作业,这样我们就可以跟踪训练的进展情况,并查看机器运行日志。.

在人工智能平台控制台查看工作时,可以获取许多信息

View of AI Platform Jobs interface

任务完成后,训练好的模型会以 .pth 文件的形式保存在 GCS 存储桶中,同时保存的还有一个包含其性能的 .json 文件。.

Folder where the files are stored after the training

我们决定分别考虑标签的结果,就好像我们对每个可能的标签都有一个二元分类器一样。.

由于我们使用的是 FastAI,因此可以在任何环境下调用 FastAI 的 load_learner() 方法直接加载模型文件。.

Reusability of trained model

主要收获

使用人工智能平台自动训练模型使我们节省了大量时间,并使我们考虑到模型训练的各个方面,从而高效地将其投入生产。.

以下是我们从中获得的一些启示:

  • 在将 Docker 镜像推送到 GCR 之前,直接在您的机器上构建和运行 Docker 镜像可以节省大量调试时间,但一定要有足够强大的机器(例如带 GPU 的谷歌虚拟机)。

  • 必须明确定义参数和参数及其默认值,以简化训练过程,同时允许用户根据自己的需要对其进行调整

  • FastAI 是一个出色的 ML 库,而 AI Platform Training 则非常适合自动训练其模型。更重要的是,只需修改软件仓库中的训练代码,同样的方法就可以应用于任何框架。

下一步是什么?

既然我们已经解释了如何自动训练模型,那么现在就可以向大家展示我们是如何设法让模型可以轻松调用,按需对文件进行分类的。.

请继续关注本文的第二部分,其中将介绍使用 AI Platform 和 TorchServe 部署训练有素的分类器所需的一切知识!

感谢您的阅读!

希望您今天有所收获,并对您未来的 ML 项目有所帮助。如果您对此主题有任何疑问或评论,请随时联系我们。.

您可以在我们的 Medium 博客上找到更多关于我们和我们项目的信息