使用Docker在Azure上部署机器学习模型

应用代码

将使用与之前文章中相同的应用代码和容器定义。为了保持解决方案的清晰和专注,附加的代码归档仅包含发布示例到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容器注册表,需要一个简单的命令:

$ 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模型即使在停止、删除和重新创建容器后也会被持久化。

创建支持GPU的容器实例

可能已经注意到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清理

为了避免不受控制的费用,需要清理不再使用的Azure资源。当使用昂贵的容器主机配置(有很多CPU/RAM或带有GPU,例如)时,这一点尤为重要。

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

$ az container stop --name $ACI_NAME --resource-group $RG_NAME $ az group delete --name $RG_NAME
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485