目录
介绍
应用代码
准备Azure资源
构建容器镜像并将其推送到Azure容器注册表
创建和运行容器
创建具有GPU支持的容器实例
容器实例限制
Azure 清理
总结
- 下载项目文件 - 6 KB
Docker等容器技术可简化依赖项管理并提高软件的可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。
本系列假设您熟悉AI/ML、容器化,尤其是Docker。
在上一篇文章中,我们使用Fast API和Gunicorn调试了通过Rest API服务公开的NLP模型。
在本文(本系列的最后一篇)中,我们将使用Azure容器实例将我们的Rest API服务部署到云。欢迎您下载本文中使用的代码。
应用代码我们将使用我们在前几篇文章中使用的相同应用程序代码和容器定义。为了保持解决方案的简洁和专注,附加的代码存档仅包含将我们的示例发布到Azure所需的那些文件。如果您想要挑战,可以使用我们将在此处讨论的代码片段(而不是使用本文的代码下载)扩展最后两篇文章之一的解决方案。
准备Azure资源如果您还没有Azure订阅,您可以创建一个免费帐户。
首先,让我们设置正确的Azure AD目录和订阅:
$ az login --tenant
$ az account set --subscription
确保用正确的值(例如,分别为your_directory_name@onmicrosoft.com和 222aaa2a-a2a2-22aa-a222-2aaaa2a22a22)替换和占位符。请注意,如果您只有一个Azure订阅和一个Azure Active Directory,则该az login语句不带任何其他参数就足够了。
要发布我们的应用程序,我们需要设置一些Azure资源,即:具有文件共享和容器注册表的存储帐户。我们可以使用Azure门户或命令行来创建它们。我们将使用后一个选项,使用bash和azure-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_ID,STORAGE_KEY,ACR_ID,和在随后声明的ACR_KEY)。
要构建容器映像并将其推送到我们新创建的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上:
您可能已经注意到该az container create命令的配置选项很少(CPU数量和RAM 大小)。要将GPU添加到容器中,我们需要使用配置文件,该文件可以实现为YAML或Azure资源管理器(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/RAM或GPU)时,这一点尤其重要。
至少,当您不打算再使用容器实例时,您应该始终停止它:
$ 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