(十)将AI Docker容器部署到云端

目录

介绍

应用代码

准备Azure资源

构建容器镜像并将其推送到Azure容器注册表

创建和运行容器

创建具有GPU支持的容器实例

容器实例限制

Azure 清理

总结


介绍

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

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

上一篇文章中,我们使用Fast APIGunicorn调试了通过Rest API服务公开的NLP模型。

在本文(本系列的最后一篇)中,我们将使用Azure容器实例将我们的Rest API服务部署到云。欢迎您下载本文中使用的代码。

应用代码

我们将使用我们在前几篇文章中使用的相同应用程序代码和容器定义。为了保持解决方案的简洁和专注,附加的代码存档仅包含将我们的示例发布到Azure所需的那些文件。如果您想要挑战,可以使用我们将在此处讨论的代码片段(而不是使用本文的代码下载)扩展最后两篇文章之一的解决方案。

准备Azure资源

如果您还没有Azure订阅,您可以创建一个免费帐户

首先,让我们设置正确的Azure AD目录和订阅:

$ az login --tenant <your_tenant_uri>
$ az account set --subscription <your_subscription_guid>

确保用正确的值(例如,分别为your_directory_name@onmicrosoft.com 222aaa2a-a2a2-22aa-a222-2aaaa2a22a22)替换<your_tenant_uri><your_subscription_guid>占位符。请注意,如果您只有一个Azure订阅和一个Azure Active Directory,则该az login语句不带任何其他参数就足够了。

要发布我们的应用程序,我们需要设置一些Azure资源,即:具有文件共享和容器注册表的存储帐户。我们可以使用Azure门户或命令行来创建它们。我们将使用后一个选项,使用bashazure-cli

LOCATION='westeurope'
BASE_NAME='mld10api'
RG_NAME='rg-'$BASE_NAME
STORAGE_NAME=$BASE_NAME'store'
SHARE_NAME=$BASE_NAME'share'
ACR_NAME=$BASE_NAME'acr'

az group create --name $RG_NAME --location $LOCATION
STORAGE_ID=$(az storage account create -n $STORAGE_NAME --resource-group $RG_NAME --location $LOCATION --sku Standard_LRS --query 'id')
STORAGE_KEY=$(az storage account keys list --resource-group $RG_NAME --account-name $STORAGE_NAME --query '[0].value' --output tsv)
az storage share create --name $SHARE_NAME --account-name $STORAGE_NAME  --account-key $STORAGE_KEY
ACR_ID=$(az acr create -n $ACR_NAME --resource-group $RG_NAME --sku 'Basic' --admin-enabled --query 'id')
ACR_KEY=$(az acr credential show --name $ACR_NAME --query 'passwords[0].value' --output tsv)

请确保您使用一个单一的控制台会话的所有步骤,因为我们需要访问新定义的变量(包括STORAGE_IDSTORAGE_KEYACR_ID,和在随后声明的ACR_KEY)。

构建容器镜像并将其推送到Azure容器注册表

要构建容器映像并将其推送到我们新创建的Azure容器注册表,我们需要一个简单的命令:

$ IMAGE_TAG=$BASE_NAME'img:v1'
$ az acr build --registry $ACR_NAME --image $IMAGE_TAG .

请注意,您甚至不需要安装Docker即可使用此命令,因为构建在云中运行。或者,如果您更喜欢使用本地Docker安装构建镜像,您可以使用以下顺序:

$ docker login $ACR_NAME.azurecr.io
$ docker build -t $IMAGE_TAG .
$ docker tag $IMAGE_TAG $ACR_NAME.azurecr.io/$IMAGE_TAG
$ docker push $ACR_NAME.azurecr.io/$IMAGE_TAG

创建和运行容器

现在我们只剩下一步了——Azure上创建和运行容器实例。我们可以使用az container create命令来完成。在最简单的形式中,我们直接指定所有必需的参数。例如:

$ ACI_NAME=$BASE_NAME'aci'
$ ACI_DNS=$BASE_NAME'-nlp-api'
$ az container create \
    --resource-group $RG_NAME \
    --name $ACI_NAME \
    --image $ACR_NAME.azurecr.io/$IMAGE_TAG  \
   --dns-name-label $ACI_DNS \
   --ports 8000 \
   --cpu 1 \
   --memory 4.0 \
   --registry-username $ACR_NAME \
   --registry-password $ACR_KEY \
   --azure-file-volume-account-name $STORAGE_NAME \
   --azure-file-volume-account-key $STORAGE_KEY \
   --azure-file-volume-share-name $SHARE_NAME \
   --azure-file-volume-mount-path /home/mluser/.cache

最后四个--azure-file-volume-*属性将我们的Azure文件共享作为一个卷映射到我们的容器。这样,即使我们停止、删除和重新创建容器,我们在服务中下载和使用的NLP模型也将被持久化。

几分钟后(这里指的是几分钟——这需要一段时间),我们的容器应该启动并运行:

使用我们容器服务的FQDN地址,后跟“:8000/docs”,我们可以访问我们服务的OpenAPI接口,就像我们之前所做的一样。唯一的区别是现在它托管在Azure上:

创建具有GPU支持的容器实例

您可能已经注意到该az container create命令的配置选项很少(CPU数量和RAM 大小)。要将GPU添加到容器中,我们需要使用配置文件,该文件可以实现为YAMLAzure资源管理器(ARM)模板

有了这些知识,我们可以使用YAML配置再次重新创建我们的容器,这次添加了GPU支持:

$ az container delete --name $ACI_NAME --resource-group $RG_NAME

$ echo "
apiVersion: '2018-10-01'
name: $ACI_NAME
properties:
  containers:
  - name: $ACI_NAME-1
    properties:
      image: $ACR_NAME.azurecr.io/$IMAGE_TAG
      ports:
      - protocol: TCP
        port: 8000
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 4.0
          gpu:
            count: 1
            sku: K80
      volumeMounts: # Array of volume mounts for the instance
      - name: mluser-cache
        mountPath: /home/mluser/.cache
        readOnly: false
  imageRegistryCredentials: # Credentials to pull a private image
  - server: $ACR_NAME.azurecr.io
    username: $ACR_NAME
    password: $ACR_KEY
  osType: Linux
  restartPolicy: OnFailure
  ipAddress: # IP address configuration of container group
    ports:
    - protocol: TCP
      port: 8000
    type: Public
    dnsNameLabel: $ACI_DNS
  volumes: # Array of volumes available to the instances
  - name: mluser-cache
    azureFile:
      shareName: $SHARE_NAME
      readOnly: false
      storageAccountName: $STORAGE_NAME
      storageAccountKey: $STORAGE_KEY
" >> .containers.yml

$ az container create --resource-group $RG_NAME --file .containers.yml --location $LOCATION

请注意,生成的.containers.yml文件包含Azure容器注册表$ACR_KEY)和存储帐户($STORAGE_KEY) 的密钥(密码)。这就是为什么你在处理它时应该非常小心。您永远不应该将它添加到代码存储库中。

az container create命令使用保存的配置文件来创建和启动容器(这次有GPU支持)。

如果一切顺利,我们新的预测时间应该会大大减少。在我们的实验中,GPU上的推理比仅使用CPU的部署快大约两倍。

容器实例限制

使用Azure容器实例是在Azure云上运行Docker容器的最简单方法。不过,通常只推荐用于快速原型而不是生产系统。主要原因是您可以使用一组粗糙的可扩展性选项,仅限于CPU数量、RAM大小和GPU数量。要更改这些值中的任何一个,您需要重新创建容器实例。如果您需要更高级的可扩展性选项,例如水平或自动缩放,您可能需要使用更强大的功能,例如Azure机器学习服务Azure Kubernetes服务

Azure 清理

为避免不受控制的费用,您需要清理不再使用的Azure资源。当您使用昂贵的容器主机配置(例如,具有大量CPU/RAMGPU)时,这一点尤其重要。

至少,当您不打算再使用容器实例时,您应该始终停止它:

$ az container stop --name $ACI_NAME --resource-group $RG_NAME

如果要删除所有相关资源,可以删除整个资源组:

$ az group delete --name $RG_NAME

总结

我们已使用容器实例成功将自然语言处理REST API服务发布到Azure云。在本系列文章中,我们探索了在ML任务中应用Docker容器的几个场景。我们希望您能在我们的文章中找到对自己有用的东西。

https://www.codeproject.com/Articles/5302896/Deploying-AI-Docker-Containers-to-the-Cloud

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值