将使用与之前文章中相同的应用代码和容器定义。为了保持解决方案的清晰和专注,附加的代码归档仅包含发布示例到Azure所需的文件。如果想挑战自己,可以使用在这里讨论的代码片段扩展最后两篇文章中的解决方案之一(而不是使用本文的代码下载)。
如果还没有Azure订阅,可以创建一个免费账户。首先,让设置正确的Azure AD目录和订阅:
az login --tenant
az account set --subscription
请确保替换
要构建容器镜像并将其推送到新创建的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模型即使在停止、删除和重新创建容器后也会被持久化。
可能已经注意到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)的密钥。这就是为什么在处理它时要非常小心。永远不应该将其添加到代码仓库中。
使用Azure容器实例是在Azure云上运行Docker容器的最简单方法。通常,它只推荐用于快速原型而不是生产系统。主要原因是拥有的可扩展性选项非常有限,仅限于CPU数量、RAM大小和GPU数量。要更改这些值中的任何一个,需要重新创建容器实例。如果需要更高级的可扩展性选项,例如水平或自动扩展,可能需要使用更健壮的东西,如Azure机器学习服务或Azure Kubernetes服务。
为了避免不受控制的费用,需要清理不再使用的Azure资源。当使用昂贵的容器主机配置(有很多CPU/RAM或带有GPU,例如)时,这一点尤为重要。
至少,当不打算再使用它时,应该始终停止容器实例:
$ az container stop --name $ACI_NAME --resource-group $RG_NAME
$ az group delete --name $RG_NAME