你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将关键短语提取容器部署到 Azure Kubernetes 服务

了解如何将关键短语提取 Docker 容器映像部署到 AKS Azure Kubernetes 服务 (AKS)。 此过程演示如何创建语言资源、如何关联容器映像,以及如何从浏览器开展这两者之间的业务流程。 使用容器可以将你的关注点从管理基础结构转移到应用程序开发上。 虽然本文使用关键短语提取容器作为示例,但你可以将此过程用于适用于 Azure AI 语言提供的其他容器

先决条件

此过程要求必须在本地安装和运行多个工具。 请勿使用 Azure Cloud Shell。 需要满足以下条件:

  • Azure 订阅。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户
  • 文本编辑器,例如 Visual Studio Code
  • 已安装 Azure CLI
  • 已安装 Kubernetes CLI
  • 具有适当定价层的 Azure 资源。 并非所有定价层都适用于此容器:
    • 仅具有 F0 或标准定价层的 Azure AI 语言资源。
    • 具有 S0 定价层的 Azure AI 服务资源

创建 Azure AI 语言资源

  1. 登录到 Azure 门户

  2. 选择“创建资源”,然后中转到“AI + 机器学习” >“语言”。 或者,转到创建语言资源

  3. 输入所有所需设置:

    设置
    名称 输入名称(2-64 个字符)。
    订阅 选择适当的订阅。
    位置 选择一个邻近的位置。
    定价层 输入 S(标准定价层)。
    资源组 选择可用的资源组。
  4. 选择“创建”,然后等待创建资源。 浏览器将自动重定向到新创建的资源页。

  5. 收集配置的 endpoint 和 API 密钥:

    门户中的“资源”选项卡 设置 “值”
    概述 端点 复制终结点。 其外观类似于 https://my-resource.cognitiveservices.azure.com/text/analytics/v3.0
    “键” API 密钥 复制两个密钥中的一个。 它是一个 32 个字符的字母数字字符串(不包含空格或短划线):<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>。

创建 Azure Kubernetes 服务群集资源

  1. 转到 Azure Kubernetes 服务,然后选择“创建”。

  2. 在“基本信息”选项卡中输入以下信息:

    设置 “值”
    订阅 选择相应的订阅。
    资源组 选择可用的资源组。
    Kubernetes 群集名称 输入名称(小写)。
    区域 选择附近的位置。
    Kubernetes 版本 标记为“(默认值)”的任何值。
    DNS 名称前缀 自动创建,但可以重写。
    节点大小 标准 DS2 v2:
    2 vCPUs, 7 GB
    节点计数 将滑块留在默认值的位置。
  3. 在“节点池”选项卡上,将“虚拟节点”和“VM 规模集”设置为其默认值。

  4. 在“身份验证”选项卡上,将“服务主体”和“启用 RBAC”设为其默认值。

  5. 在“网络”选项卡上,输入以下选择:

    设置
    HTTP 应用程序路由
    网络配置 基本
  6. 在“集成”选项卡上,确保将“容器监视”设置为“已启用”,将“Log Analytics 工作区”保留为默认值。

  7. 在“标记”选项卡上,暂时让名称/值对保留空白。

  8. 选择“查看并创建”。

  9. 通过验证后,选择“创建”。

注意

如果验证失败,可能是由于“服务主体”错误。 返回到“身份验证”选项卡,然后回到“查看 + 创建”,应该会在其中运行验证,然后验证会通过。

将关键短语提取容器部署到 AKS 群集

  1. 打开 Azure CLI,登录到 Azure。

    az login
    
  2. 登录到 AKS 群集。 将 your-cluster-nameyour-resource-group 替换为相应的值。

    az aks get-credentials -n your-cluster-name -g -your-resource-group
    

    此命令在运行后会报告类似以下内容的消息:

    Merged "your-cluster-name" as current context in /home/username/.kube/config
    

    警告

    如果在 Azure 帐户上有多个可用订阅,而 az aks get-credentials 命令返回错误,则表明你使用了错误的订阅,这是一个常见问题。 将 Azure CLI 会话的上下文设置为使用你在创建这些资源时使用的订阅,然后重试。

     az account set -s subscription-id
    
  3. 打开所选的文本编辑器。 此示例使用 Visual Studio Code。

    code .
    
  4. 在文本编辑器中创建名为“keyphrase.yaml”的新文件,然后将以下 YAML 粘贴到其中。 请确保将 billing/valueapikey/value 替换为自己的信息。

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: keyphrase
    spec:
      template:
        metadata:
          labels:
            app: keyphrase-app
        spec:
          containers:
          - name: keyphrase
            image: mcr.microsoft.com/azure-cognitive-services/keyphrase
            ports:
            - containerPort: 5000
            resources:
              requests:
                memory: 2Gi
                cpu: 1
              limits:
                memory: 4Gi
                cpu: 1
            env:
            - name: EULA
              value: "accept"
            - name: billing
              value: # {ENDPOINT_URI}
            - name: apikey
              value: # {API_KEY}
    
    --- 
    apiVersion: v1
    kind: Service
    metadata:
      name: keyphrase
    spec:
      type: LoadBalancer
      ports:
      - port: 5000
      selector:
        app: keyphrase-app
    

重要

完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。

  1. 保存该文件并关闭文本编辑器。

  2. 运行 Kubernetes apply 命令,将 keyphrase.yaml 文件作为其目标:

    kubectl apply -f keyphrase.yaml
    

    当命令成功应用部署配置以后,会出现类似于以下输出的消息:

    deployment.apps "keyphrase" created
    service "keyphrase" created
    
  3. 验证 Pod 是否已部署:

    kubectl get pods
    

    Pod 的运行状态输出:

    NAME                         READY     STATUS    RESTARTS   AGE
    keyphrase-5c9ccdf575-mf6k5   1/1       Running   0          1m
    
  4. 验证服务是否可用,然后获取 IP 地址。

    kubectl get services
    

    Pod 中 keyphrase 服务的运行状态输出:

    NAME         TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
    kubernetes   ClusterIP      10.0.0.1      <none>           443/TCP          2m
    keyphrase    LoadBalancer   10.0.100.64   168.61.156.180   5000:31234/TCP   2m
    

验证关键短语提取容器实例

  1. 选择“概述”选项卡,并复制 IP 地址。

  2. 打开新的浏览器选项卡,并输入 IP 地址。 例如,输入 http://<IP-address>:5000 (http://55.55.55.55:5000)。 此时将显示容器的主页,让你知道该容器正在运行。

    查看容器主页,以验证它是否处于运行状态

  3. 选择“服务 API 说明”链接,以转到该容器的 Swagger 页。

  4. 选择任意一个 POST API,然后选择“试用”。此时将显示参数,其中包括以下示例输入:

    {
      "documents": [
        {
          "id": "1",
          "text": "Hello world"
        },
        {
          "id": "2",
          "text": "Bonjour tout le monde"
        },
        {
          "id": "3",
          "text": "La carretera estaba atascada. Había mucho tráfico el día de ayer."
        },
        {
          "id": "4",
          "text": ":) :( :D"
        }
      ]
    }
    
  5. 将该输入替换为以下 JSON 内容:

    {
      "documents": [
        {
          "language": "en",
          "id": "7",
          "text": "I was fortunate to attend the KubeCon Conference in Barcelona, it is one of the best conferences I have ever attended. Great people, great sessions and I thoroughly enjoyed it!"
        }
      ]
    }
    
  6. 将“showStats”设置为 true

  7. 选择“执行”以确定文本的情绪。

    在容器中打包的模型会生成范围为从 0 到 1 的分数,其中,0 表示消极,而 1 表示积极。

    返回的 JSON 响应包括更新的文本输入的情绪:

    {
      "documents": [
        {
          "id": "7",
          "keyPhrases": [
            "Great people",
            "great sessions",
            "KubeCon Conference",
            "Barcelona",
            "best conferences"
          ],
          "statistics": {
            "charactersCount": 176,
            "transactionsCount": 1
          }
        }
      ],
      "errors": [],
      "statistics": {
        "documentsCount": 1,
        "validDocumentsCount": 1,
        "erroneousDocumentsCount": 0,
        "transactionsCount": 1
      }
    }
    

我们现在可以将响应有效负载的 JSON 数据的文档 id 关联到原始请求有效负载文档 id。 生成的文档有一个 keyPhrases 数组,其中包含已从相应输入文档中提取的关键短语的列表。 此外,每个生成的文档都有各种统计信息(例如 characterCounttransactionCount)。

后续步骤