(七)使用NLP和Transformer在大型模型上的Dockerized AI

目录

介绍

容器和大型模型

用于Transformer的Dockerfile

组合容器

构建容器

运行容器

总结


介绍

Docker等容器技术可简化依赖项管理并提高软件的可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。

本系列假设您熟悉AI/ML、容器化,尤其是Docker

在本系列的前一篇文章中,我们使用TensorFlow使用容器化对象检测API环境对示例镜像进行了推理。在这一方面,我们将继续处理大型模型,这次是使用PyTorchTransformers处理自然语言处理(NLP)任务。欢迎您下载本文中使用的代码。

在本系列的后续文章中,我们将通过Rest API提供推理模型。接下来,我们将调试在容器中运行的Rest API服务。最后,我们将使用Azure容器实例在云中发布创建的容器。

容器和大型模型

只要您使用相对较小的模型,容器用于机器学习就相当简单。最简单的方法是将模型视为代码的一部分,并在构建期间将它们添加到容器中。随着模型变大,这变得更加复杂。通常,模型可以测量数百兆字节甚至更多。向镜像添加如此多的权重会增加其大小和构建时间。此外,如果您在水平扩展的集群中运行您的代码,这个额外的权重将乘以正在运行的容器的数量。

作为一般规则,您不应在镜像中包含任何可以在容器实例之间轻松共享的内容。在开发过程中,可以通过将本地文件夹映射到容器卷来处理共享文件。这就是我们在上一篇文章中为对象检测API模型所做的。在生产中,这可能是不可能的,特别是如果你计划在云中运行你的容器。

在这种情况下,首选的解决方案是依赖Docker卷。但是这种方法有一些缺点。在容器之间持久化和共享任何东西会引入额外的依赖关系。同一个容器的行为可能会有所不同,具体取决于持久卷中已存储的内容。此外,在容器已经运行之前(不是在构建期间),您不能在卷中存储任何内容。

用于TransformerDockerfile

HuggingFace Transformers是一个非常流行的库,用于处理自然语言处理(NLP)任务。它支持许多现代NLP模型架构和机器学习框架,包括TensorFlowPyTorch。我们已经使用过TensorFlow几次——让我们用PyTorch版本进行更改。

我们的Dockerfile将相当简单:

FROM pytorch/pytorch:1.6.0-cuda10.1-cudnn7-runtime

ENV DEBIAN_FRONTEND=noninteractive

ARG USERNAME=mluser
ARG USERID=1000
RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME \
 && mkdir /home/$USERNAME/.cache && chown -R $USERNAME /home/$USERNAME/.cache 

COPY requirements.txt /tmp/requirements.txt 
RUN pip install -r /tmp/requirements.txt \
 && rm /tmp/requirements.txt

USER $USERNAME
COPY --chown=$USERNAME ./app /home/$USERNAME/app
WORKDIR /home/$USERNAME/app

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

ENTRYPOINT ["python", "nlp.py"]

除了基础镜像之外,与上一篇文章没有太大区别。官方的PyTorch基础镜像为我们提供了我们需要的一切,并且仍然比TensorFlow-GPU小。

这一次,我们不需要任何额外的系统依赖项,因此我们可以避免使用该apt-get命令。注意第一条RUN语句中的mkdir /home/$USERNAME/.cache命令。在容器执行期间,我们将为下载的PyTorch模型挂载一个Docker卷到此路径。

我们显式创建此文件夹以在构建镜像时启用设置访问权限。这些权限将延续到容器执行期间安装的卷。

requirements.txt文件是非常紧凑的,以及。它包含一行:

transformers==4.3.2

我们解决方案中最复杂的部分存储在nlp.py脚本中。它被设置为我们容器的入口点,并且可以在代码下载档案中找到。

组合容器

为了简化卷的创建和挂载,这次我们将使用docker-compose来构建和运行我们的容器。如果您使用的是Docker桌面,您应该已经安装了它。对于Linux上的Docker Server,您可能需要安装它

请注意,在最近的Docker版本中,您可以使用docker compose命令代替docker-compose 然而,令我们惊讶的是,我们注意到这两个命令带来的结果并不总是相同的。所以我们将在本系列文章中坚持使用docker-compose

现在,让我们在Dockerfile所在的同一目录中创建一个简短docker-compose.yml文件:

version: '3.7'
volumes:
  mluser_cache:
    name: mluser_cache
services:
  mld07_transformers: 
    build:
      context:  '.'
      dockerfile: 'Dockerfile'
    image: 'mld07_transformers'
    volumes:
      - mluser_cache:/home/mluser/.cache

我们指示docker-compose在这里做两件事:创建mluser_cache卷并在容器运行时将其挂载到路径/home/mluser/.cache。除此之外,该文件还定义了镜像名称和构建上下文。

构建容器

使用docker-compose,构建容器的命令将与上一篇文章略有不同:

$ docker-compose build --build-arg USERID=$(id -u)

docker-compose.yml配置中包含所有基本参数,我们在这里只需要传递USERID值。因为这次我们不会挂载本地文件夹作为容器卷,所以可以安全地忽略该--build-arg USERID属性。事实上,在Windows上运行时,您可以随时忽略它。我们只保留在这里,以确保后续文章的权限一致。

运行容器

现在容器已构建,让我们检查它是否有效。我们将从问答任务开始:

$ docker-compose run --user $(id -u) mld07_transformers \
--task="qa" \
--document="We have considered many names for my dog, such as: Small, Black or Buster. Finally we have called him Ratchet. It is quite an unusual name, but the dog's owner named Michael picked it." \
--question="What is the name of my dog?"

我们在这里故意狡猾:在文档中抛出多个名称;然而,该模型处理得很好:

第一次执行模型时,相关模型被下载并存储在映射到我们mluser_cache卷的.cache文件夹中。

要检查卷大小,我们可以使用以下命令:

$ docker system df -v

本地卷空间使用情况应显示:

为了确保模型数据被持久化,我们可以运行与之前相同的docker-compose run命令,结果略有不同:

这次模型已经在.cache文件夹中,所以没有再次下载。

对于下载的nlp.py脚本中包含的不同NLP任务,您可以随意尝试其他模型。请注意,这些模型中的每一个都需要在第一次使用时下载,其中一些模型的大小超过1GB

总结

我们的NLP任务推理模型正在运行,下载的模型被保存到持久卷中。在下一篇文章中,我们将修改我们的代码以通过Rest API服务公开相同的逻辑。敬请关注!

https://www.codeproject.com/Articles/5302893/Dockerized-AI-on-Large-Models-With-NLP-and-Transfo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值