deploy-cognitive-service-to-aks-on-China-azure

部署认知服务的容器到China Azure上的AKS群集


微软云Azure的认知服务包含五大类几十个具体的人工智能服务,可以帮助您创建相应的应用程序服务于各种场景,可以参考Azure认知服务的官方文档

这些认知服务除了提供云端服务的能力,很多服务也同时推出了容器版本,用户可以直接将认知服务的能力以容器的形式部署在本地基础架构、边缘服务器中。

本地部署认知服务时,容器会每15分钟访问云端的计费接口,只统计计费相关的信息。因此,本地部署时,也需要在云端创建相应的服务,以便于获得容器正常运行所需要的Key和连接的端点(endpoint)。

当然也可以将这些容器部署在Kubernetes群集中,本文则已Azure托管的Kubernetes服务AKS进行部署认知服务的容器。

前提条件

环境准备

建议安装最新版本,本实例要求运行 Azure CLI 2.0.64 版或更高版本。Azure CLI既可以访问China Azure,也可以访问全球Azure。
访问China Azure需要设置:

az cloud set -n AzureChinaCloud

访问全球Azure需要设置:

az cloud set -n AzureCloud

创建AKS群集

可以参考使用Azure门户部署AKS群集,或者使用Azure CLI创建AKS群集
下面是具体步骤的截图,供参考:

获得认知服务的容器

可以从下面两篇文章中申请和获得认知服务众多的AI能力的容器

Azure认知服务中的容器

具体容器的Registry

以文本转语音(TTS)为例,可以看到默认的容器路径是containerpreview.azurecr.io/microsoft/cognitive-services-text-to-speech

tag是latest的具有 en-US 区域设置和 en-US-JessaRUS 语音的容器映像。

如果要使用中文,可以使用tag为1.3.0-amd64-zh-cn-kangkang-apollo-preview,即完整的容器引用为containerpreview.azurecr.io/microsoft/cognitive-services-text-to-speech:1.3.0-amd64-zh-cn-kangkang-apollo-preview

可以看到TTS的容器目前是需要申请才能获得的,申请方式前文已提到。而对于registry是mcr.microsoft.com/azure-cognitive-services的容器,则已经都是公开的了,大家可以自行下载测试。

部署TTS容器到AKS中

创建AKS用于拉取容器的secret

填写申请表格后,将会收到用于拉取容器的用户名和密码,在客户端使用下面的命令创建secret:

kubectl create secret docker-registry <secret-name> --docker-server=containerpreview.azurecr.io --docker-username=<username> --docker-password=<pwd>

准备部署使用的YAML文件

使用Azure上创建的speech服务的Key和Endpoint替换Yaml文件相应的位置:

apiVersion: v1
kind: Service
metadata:
  name: tts
  labels:
    run: tts
spec:
  selector:
    app: tts
  type: LoadBalancer
  ports:
  - name: tts
    port: 5000
    targetPort: 5000
    protocol: TCP
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: tts
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tts
    spec:
      containers:
      - name: tts
        image: containerpreview.azurecr.io/microsoft/cognitive-services-text-to-speech:1.3.0-amd64-zh-cn-kangkang-apollo-preview
        ports:
        - name: public-port
          containerPort: 5000
        resources:
          requests:
            memory: 4Gi
            cpu: 1
          limits:
            memory: 6Gi
            cpu: 2
        livenessProbe:
          httpGet:
            path: /status
            port: public-port
          initialDelaySeconds: 30
          timeoutSeconds: 1
          periodSeconds: 10
        args:
            - "eula=accept"
            - "apikey=<api key>" # Add API Key here
            - "billing=https://chinaeast2.api.cognitive.azure.cn/sts/v1.0/issuetoken" # Add billing key here
      imagePullSecrets:
        - name: tts-docker-secret # Add credentials for container preview registry here
      automountServiceAccountToken: false

使用上一步骤中的Yaml文件进行部署

kubectl apply -f cs_tts.yml

部署过程中,可以使用 kubectl describe pod 看到AKS根据Yaml文件去拉取TTS的image:

成功部署后,可以使用kubectl get pod|service查看相应的pod和service:

测试TTS容器

查看service时可以看到LB的外部IP和端口,这个即是TTS对外提供服务的地址,可以直接访问查看状态: 查看具体的API:

可以参考TTS的repo使用各种语言的调用REST API或SDK进行调用。 下面是使用python的一个sample示例:

音频输出结果