Usar contêineres de serviço de fala com Kubernetes e Helm

Uma opção para gerenciar seus contêineres de fala no local é usar o Kubernetes e o Helm. Usando o Kubernetes e o Helm para definir as imagens de contêiner de fala para texto e texto para fala, criamos um pacote Kubernetes. Este pacote é implantado em um cluster Kubernetes local. Finalmente, exploramos como testar os serviços implantados e várias opções de configuração. Para obter mais informações sobre como executar contêineres do Docker sem orquestração do Kubernetes, consulte instalar e executar contêineres do serviço de fala.

Pré-requisitos

Os seguintes pré-requisitos antes de usar contêineres de fala no local:

Necessário Propósito
Conta do Azure Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Acesso ao Registo de Contentores Para que o Kubernetes puxe as imagens do docker para o cluster, ele precisa acessar o registro do contêiner.
Kubernetes CLI A CLI do Kubernetes é necessária para gerenciar as credenciais compartilhadas do registro do contêiner. O Kubernetes também é necessário antes do Helm, que é o gerenciador de pacotes do Kubernetes.
Leme CLI Instale a CLI Helm, que é usada para instalar um gráfico de leme (definição de pacote de contêiner).
Recurso de fala Para utilizar estes contentores, deve ter:

Um recurso do Azure de Fala para obter a chave de cobrança associada e o URI do ponto de extremidade de cobrança. Ambos os valores estão disponíveis nas páginas Visão Geral de Fala e Chaves do portal do Azure e são necessários para iniciar o contêiner.

{API_KEY}: chave de recurso

{ENDPOINT_URI}: exemplo de URI do ponto de extremidade é: https://eastus.api.cognitive.microsoft.com/sts/v1.0

Consulte os detalhes do computador host do contêiner do serviço de fala como referência. Este gráfico de leme calcula automaticamente os requisitos de CPU e memória com base em quantas decodificações (solicitações simultâneas) o usuário especifica. Além disso, ele se ajusta com base em se as otimizações para entrada de áudio/texto estão configuradas como enabled. O gráfico de leme assume como padrão duas solicitações simultâneas e desabilita a otimização.

Serviço CPU / Contentor Memória / Contentor
fala para texto Um descodificador requer um mínimo de 1.150 milinúcleos. Se o optimizedForAudioFile estiver ativado, serão necessários 1.950 milinúcleos. (padrão: dois decodificadores) Necessário: 2 GB
Limitado: 4 GB
conversão de texto em fala Uma solicitação simultânea requer um mínimo de 500 milinúcleos. Se o optimizeForTurboMode estiver ativado, serão necessários 1.000 milinúcleos. (padrão: duas solicitações simultâneas) Necessário: 1 GB
Limitado: 2 GB

Conectar-se ao cluster do Kubernetes

Espera-se que o computador host tenha um cluster Kubernetes disponível. Consulte este tutorial sobre como implantar um cluster Kubernetes para obter uma compreensão conceitual de como implantar um cluster Kubernetes em um computador host.

Configurar valores de gráfico de leme para implantação

Visite o Microsoft Helm Hub para obter todos os gráficos de leme disponíveis publicamente oferecidos pela Microsoft. No Microsoft Helm Hub, você encontra o Gráfico Local de Fala da IA do Azure. O Azure AI Speech On-Premises é o gráfico que instalamos, mas primeiro devemos criar um config-values.yaml arquivo com configurações explícitas. Vamos começar adicionando o repositório da Microsoft à nossa instância Helm.

helm repo add microsoft https://microsoft.github.io/charts/repo

Em seguida, configuramos nossos valores de gráfico de leme. Copie e cole o seguinte YAML em um arquivo chamado config-values.yaml. Para obter mais informações sobre como personalizar o Gráfico de Leme Local de Fala do Azure AI, consulte Personalizar gráficos de leme. Substitua os comentários e # {API_KEY} pelos # {ENDPOINT_URI} seus próprios valores.

# These settings are deployment specific and users can provide customizations
# speech to text configurations
speechToText:
  enabled: true
  numberOfConcurrentRequest: 3
  optimizeForAudioFile: true
  image:
    registry: mcr.microsoft.com
    repository: azure-cognitive-services/speechservices/speech-to-text
    tag: latest
    pullSecrets:
      - mcr # Or an existing secret
    args:
      eula: accept
      billing: # {ENDPOINT_URI}
      apikey: # {API_KEY}

# text to speech configurations
textToSpeech:
  enabled: true
  numberOfConcurrentRequest: 3
  optimizeForTurboMode: true
  image:
    registry: mcr.microsoft.com
    repository: azure-cognitive-services/speechservices/neural-text-to-speech
    tag: latest
    pullSecrets:
      - mcr # Or an existing secret
    args:
      eula: accept
      billing: # {ENDPOINT_URI}
      apikey: # {API_KEY}

Importante

Se os billing e apikey valores não forem fornecidos, os serviços expirarão após 15 min. Da mesma forma, a verificação falhará, pois os serviços não estarão disponíveis.

O pacote Kubernetes (gráfico Helm)

O gráfico Helm contém a configuração da(s) imagem(ns) docker a ser extraída(s) do mcr.microsoft.com registro do contêiner.

Um gráfico Helm é uma coleção de arquivos que descrevem um conjunto relacionado de recursos do Kubernetes. Um único gráfico pode ser usado para implantar algo simples, como um pod memcached, ou algo complexo, como uma pilha completa de aplicativos Web com servidores HTTP, bancos de dados, caches e assim por diante.

Os gráficos Helm fornecidos extraem as imagens do docker do serviço de Fala, tanto de texto para fala quanto de fala para serviços de texto do registro de mcr.microsoft.com contêiner.

Instalar o gráfico Helm no cluster do Kubernetes

Execute o helm install comando para instalar o gráfico de leme, substituindo o <config-values.yaml> pelo caminho apropriado e o argumento de nome de arquivo. O microsoft/cognitive-services-speech-onpremise gráfico Helm está disponível no Microsoft Helm Hub.

helm install onprem-speech microsoft/cognitive-services-speech-onpremise \
    --version 0.1.1 \
    --values <config-values.yaml> 

Aqui está um exemplo de saída que você pode esperar ver de uma execução de instalação bem-sucedida:

NAME:   onprem-speech
LAST DEPLOYED: Tue Jul  2 12:51:42 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                             READY  STATUS             RESTARTS  AGE
speech-to-text-7664f5f465-87w2d  0/1    Pending            0         0s
speech-to-text-7664f5f465-klbr8  0/1    ContainerCreating  0         0s
neural-text-to-speech-56f8fb685b-4jtzh  0/1    ContainerCreating  0         0s
neural-text-to-speech-56f8fb685b-frwxf  0/1    Pending            0         0s

==> v1/Service
NAME            TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)       AGE
speech-to-text  LoadBalancer  10.0.252.106  <pending>    80:31811/TCP  1s
neural-text-to-speech  LoadBalancer  10.0.125.187  <pending>    80:31247/TCP  0s

==> v1beta1/PodDisruptionBudget
NAME                                MIN AVAILABLE  MAX UNAVAILABLE  ALLOWED DISRUPTIONS  AGE
speech-to-text-poddisruptionbudget  N/A            20%              0                    1s
neural-text-to-speech-poddisruptionbudget  N/A            20%              0                    1s

==> v1beta2/Deployment
NAME            READY  UP-TO-DATE  AVAILABLE  AGE
speech-to-text  0/2    2           0          0s
neural-text-to-speech  0/2    2           0          0s

==> v2beta2/HorizontalPodAutoscaler
NAME                       REFERENCE                  TARGETS        MINPODS  MAXPODS  REPLICAS  AGE
speech-to-text-autoscaler  Deployment/speech-to-text  <unknown>/50%  2        10       0         0s
neural-text-to-speech-autoscaler  Deployment/neural-text-to-speech  <unknown>/50%  2        10       0         0s


NOTES:
cognitive-services-speech-onpremise has been installed!
Release is named onprem-speech

A implantação do Kubernetes pode levar mais de alguns minutos para ser concluída. Para confirmar se ambos os pods e serviços estão corretamente implantados e disponíveis, execute o seguinte comando:

kubectl get all

Você deve esperar ver algo semelhante à seguinte saída:

NAME                                  READY     STATUS    RESTARTS   AGE
pod/speech-to-text-7664f5f465-87w2d   1/1       Running   0          34m
pod/speech-to-text-7664f5f465-klbr8   1/1       Running   0          34m
pod/neural-text-to-speech-56f8fb685b-4jtzh   1/1       Running   0          34m
pod/neural-text-to-speech-56f8fb685b-frwxf   1/1       Running   0          34m

NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
service/kubernetes       ClusterIP      10.0.0.1       <none>           443/TCP        3h
service/speech-to-text   LoadBalancer   10.0.252.106   52.162.123.151   80:31811/TCP   34m
service/neural-text-to-speech   LoadBalancer   10.0.125.187   65.52.233.162    80:31247/TCP   34m

NAME                             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/speech-to-text   2         2         2            2           34m
deployment.apps/neural-text-to-speech   2         2         2            2           34m

NAME                                        DESIRED   CURRENT   READY     AGE
replicaset.apps/speech-to-text-7664f5f465   2         2         2         34m
replicaset.apps/neural-text-to-speech-56f8fb685b   2         2         2         34m

NAME                                                            REFERENCE                   TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/speech-to-text-autoscaler   Deployment/speech-to-text   1%/50%    2         10        2          34m
horizontalpodautoscaler.autoscaling/neural-text-to-speech-autoscaler   Deployment/neural-text-to-speech   0%/50%    2         10        2          34m

Verificar a implantação do Helm com testes do Helm

Os gráficos Helm instalados definem os testes Helm, que servem como uma conveniência para verificação. Esses testes validam a prontidão do serviço. Para verificar os recursos de fala para texto e texto para fala, executamos o comando Helm test.

helm test onprem-speech

Importante

Esses testes falharão se o status POD não Running for ou se a implantação não estiver listada AVAILABLE na coluna. Seja paciente, pois isso pode levar mais de dez minutos para ser concluído.

Esses testes produzem vários resultados de status:

RUNNING: speech to text-readiness-test
PASSED: speech to text-readiness-test
RUNNING: text to speech-readiness-test
PASSED: text to speech-readiness-test

Como alternativa à execução dos testes de leme, você pode coletar os endereços IP externos e as portas correspondentes do kubectl get all comando. Usando o IP e a porta, abra um navegador da Web e navegue até http://<external-ip>:<port>:/swagger/index.html para visualizar a(s) página(s) de swagger da API.

Personalizar gráficos de leme

Os gráficos de leme são hierárquicos. Sendo hierárquico permite a herança de gráficos, ele também atende ao conceito de especificidade, onde configurações mais específicas substituem regras herdadas.

Discurso (gráfico guarda-chuva)

Os valores no gráfico "guarda-chuva" de nível superior substituem os valores correspondentes do subgráfico. Portanto, todos os valores personalizados locais devem ser adicionados aqui.

Parâmetro Description Predefinido
speechToText.enabled Se o serviço de fala para texto está habilitado. true
speechToText.verification.enabled Se o helm test recurso para o serviço de fala para texto está habilitado. true
speechToText.verification.image.registry O repositório de imagens do docker que helm test usa para testar o serviço de fala para texto . O Helm cria um pod separado dentro do cluster para teste e extrai a imagem de uso de teste deste registro. docker.io
speechToText.verification.image.repository O repositório de imagens do docker que helm test usa para testar o serviço de fala para texto . O pod de teste Helm usa esse repositório para extrair imagens de uso de teste. antsu/on-prem-client
speechToText.verification.image.tag A tag de imagem do docker usada com helm test o serviço de fala para texto . O pod de teste Helm usa essa tag para extrair a imagem de uso de teste. latest
speechToText.verification.image.pullByHash Se a imagem do docker test-use é solicitada por hash. Se true, deverá ser adicionado speechToText.verification.image.hash, com um valor hash de imagem válido. false
speechToText.verification.image.arguments Os argumentos usados para executar a imagem docker de uso de teste. O pod de teste Helm passa esses argumentos para o contêiner durante a execução helm testdo . "./speech-to-text-client"
"./audio/whatstheweatherlike.wav"
"--expect=What's the weather like"
"--host=$(SPEECH_TO_TEXT_HOST)"
"--port=$(SPEECH_TO_TEXT_PORT)"
textToSpeech.enabled Se o serviço de conversão de texto em fala está habilitado. true
textToSpeech.verification.enabled Se o helm test recurso para o serviço de fala para texto está habilitado. true
textToSpeech.verification.image.registry O repositório de imagens do docker que helm test usa para testar o serviço de fala para texto . O Helm cria um pod separado dentro do cluster para teste e extrai a imagem de uso de teste deste registro. docker.io
textToSpeech.verification.image.repository O repositório de imagens do docker que helm test usa para testar o serviço de fala para texto . O pod de teste Helm usa esse repositório para extrair imagens de uso de teste. antsu/on-prem-client
textToSpeech.verification.image.tag A tag de imagem do docker usada com helm test o serviço de fala para texto . O pod de teste Helm usa essa tag para extrair a imagem de uso de teste. latest
textToSpeech.verification.image.pullByHash Se a imagem do docker test-use é solicitada por hash. Se true, deverá ser adicionado textToSpeech.verification.image.hash, com um valor hash de imagem válido. false
textToSpeech.verification.image.arguments Os argumentos a serem executados com a imagem docker de uso de teste. O pod de teste do leme passa esses argumentos para o contêiner durante a execução helm testdo . "./text-to-speech-client"
"--input='What's the weather like'"
"--host=$(TEXT_TO_SPEECH_HOST)"
"--port=$(TEXT_TO_SPEECH_PORT)"

Conversão de voz em texto (subgráfico: gráficos/speechToText)

Para substituir o gráfico "guarda-chuva", adicione o prefixo speechToText. em qualquer parâmetro para torná-lo mais específico. Por exemplo, ele substituirá o parâmetro correspondente, por exemplo, speechToText.numberOfConcurrentRequest substitui numberOfConcurrentRequest.

Parâmetro Description Predefinido
enabled Se o serviço de fala para texto está habilitado. false
numberOfConcurrentRequest O número de solicitações simultâneas para o serviço de fala para texto . Este gráfico calcula automaticamente os recursos da CPU e da memória, com base nesse valor. 2
optimizeForAudioFile Se o serviço precisa otimizar a entrada de áudio através de arquivos de áudio. Se true, este gráfico irá alocar mais recursos de CPU para o serviço. false
image.registry O registro de imagem do docker de fala para texto . containerpreview.azurecr.io
image.repository O repositório de imagens do docker de fala para texto . microsoft/cognitive-services-speech-to-text
image.tag A tag de imagem do docker de fala para texto . latest
image.pullSecrets Os segredos da imagem para puxar a fala para a imagem do docker de texto .
image.pullByHash Se a imagem do docker é solicitada por hash. Se true, image.hash é necessário. false
image.hash O hash de imagem do docker de fala para texto . Utilizado apenas quando image.pullByHash: true.
image.args.eula (obrigatório) Indica que aceitou a licença. O único valor válido é accept
image.args.billing (obrigatório) O valor do URI do ponto de extremidade de cobrança está disponível na página Visão Geral de Fala do portal do Azure.
image.args.apikey (obrigatório) Usado para rastrear informações de faturamento.
service.type O tipo de serviço Kubernetes do serviço de fala para texto . Consulte as instruções de tipos de serviço do Kubernetes para obter mais detalhes e verificar o suporte ao provedor de nuvem. LoadBalancer
service.port A porta do serviço de fala para texto. 80
service.annotations As anotações de fala para texto para os metadados do serviço. As anotações são pares de valores-chave.
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled Se o Horizontal Pod Autoscaler está ativado. Se true, o speech-to-text-autoscaler será implantado no cluster Kubernetes. true
service.podDisruption.enabled Se o Orçamento de Interrupção do Pod está habilitado. Se true, o speech-to-text-poddisruptionbudget será implantado no cluster Kubernetes. true

Análise de sentimento (subgráfico: charts/speechToText)

A partir da v2.2.0 do contêiner de fala para texto e da v0.2.0 do gráfico Helm, os parâmetros a seguir são usados para análise de sentimento usando a API do serviço de linguagem.

Parâmetro Description Valores Predefinição
textanalytics.enabled Se o serviço de análise de texto está habilitado verdadeiro/falso false
textanalytics.image.registry O registro de imagem docker de análise de texto Registro de imagem válido do Docker
textanalytics.image.repository O repositório de imagens docker de análise de texto Repositório de imagens válido do Docker
textanalytics.image.tag A tag de imagem do docker de análise de texto Tag de imagem válida do Docker
textanalytics.image.pullSecrets Os segredos da imagem para extrair imagem docker de análise de texto nome de segredos válidos
textanalytics.image.pullByHash Especifica se está a obter a imagem do docker por hash. Se yes, image.hash é necessário ter também. Se no, defina-o como 'false'. A predefinição é false. verdadeiro/falso false
textanalytics.image.hash O hash da imagem do docker de análise de texto. Use-o apenas com image.pullByHash:true. Um hash da imagem do docker válido
textanalytics.image.args.eula Um dos argumentos necessários por contêiner de análise de texto, que indica que você aceitou a licença. O valor desta opção deve ser: accept. accept, se pretender utilizar o contentor
textanalytics.image.args.billing Um dos argumentos necessários pelo contêiner de análise de texto, que especifica o URI do ponto de extremidade de faturamento. O valor do URI do ponto de extremidade de cobrança está disponível na página Visão Geral de Fala do portal do Azure. URI de ponto de extremidade de faturamento válido
textanalytics.image.args.apikey Um dos argumentos necessários pelo contêiner de análise de texto, que é usado para rastrear informações de faturamento. apikey válido
textanalytics.cpuRequest A CPU solicitada para contêiner de análise de texto número inteiro 3000m
textanalytics.cpuLimit A CPU limitada para contêiner de análise de texto 8000m
textanalytics.memoryRequest A memória solicitada para contêiner de análise de texto 3Gi
textanalytics.memoryLimit A memória limitada para contêiner de análise de texto 8Gi
textanalytics.service.sentimentURISuffix O sufixo URI de análise de sentimento, todo o URI está no formato "http://<service>:<port>/<sentimentURISuffix>". text/analytics/v3.0-preview/sentiment
textanalytics.service.type O tipo de serviço de análise de texto no Kubernetes. Consulte Tipos de serviço do Kubernetes tipo de serviço Kubernetes válido LoadBalancer
textanalytics.service.port A porta do serviço de análise de texto número inteiro 50085
textanalytics.service.annotations As anotações que os usuários podem adicionar aos metadados do serviço de análise de texto. Por exemplo:
anotações:
alguns/anotação1: valor1
alguns/anotação2: valor2
anotações, uma por cada linha
textanalytics.serivce.autoScaler.enabled Se o Horizontal Pod Autoscaler está ativado. Se habilitado, text-analytics-autoscaler será implantado no cluster Kubernetes verdadeiro/falso true
textanalytics.service.podDisruption.enabled Se o Orçamento de Interrupção do Pod está ativado. Se habilitado, text-analytics-poddisruptionbudget será implantado no cluster Kubernetes verdadeiro/falso true

Conversão de texto em fala (subgráfico: gráficos/textToSpeech)

Para substituir o gráfico "guarda-chuva", adicione o prefixo textToSpeech. em qualquer parâmetro para torná-lo mais específico. Por exemplo, ele substituirá o parâmetro correspondente, por exemplo, textToSpeech.numberOfConcurrentRequest substitui numberOfConcurrentRequest.

Parâmetro Description Predefinido
enabled Se o serviço de conversão de texto em fala está habilitado. false
numberOfConcurrentRequest O número de solicitações simultâneas para o serviço de conversão de texto em fala . Este gráfico calcula automaticamente os recursos da CPU e da memória, com base nesse valor. 2
optimizeForTurboMode Se o serviço precisa otimizar a entrada de texto através de arquivos de texto. Se true, este gráfico irá alocar mais recursos de CPU para o serviço. false
image.registry O registro de imagem docker de texto para fala . containerpreview.azurecr.io
image.repository O repositório de imagens docker de texto para fala . microsoft/cognitive-services-text-to-speech
image.tag A tag de imagem do docker de texto para fala . latest
image.pullSecrets Os segredos da imagem para puxar o texto para a imagem do docker de fala .
image.pullByHash Se a imagem do docker é solicitada por hash. Se true, image.hash é necessário. false
image.hash O hash de imagem do docker de texto para fala . Utilizado apenas quando image.pullByHash: true.
image.args.eula (obrigatório) Indica que aceitou a licença. O único valor válido é accept
image.args.billing (obrigatório) O valor do URI do ponto de extremidade de cobrança está disponível na página Visão Geral de Fala do portal do Azure.
image.args.apikey (obrigatório) Usado para rastrear informações de faturamento.
service.type O tipo de serviço Kubernetes do serviço de texto para fala . Consulte as instruções de tipos de serviço do Kubernetes para obter mais detalhes e verificar o suporte ao provedor de nuvem. LoadBalancer
service.port A porta do serviço de texto para fala . 80
service.annotations As anotações de texto em fala para os metadados do serviço. As anotações são pares de valores-chave.
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled Se o Horizontal Pod Autoscaler está ativado. Se true, o text-to-speech-autoscaler será implantado no cluster Kubernetes. true
service.podDisruption.enabled Se o Orçamento de Interrupção do Pod está habilitado. Se true, o text-to-speech-poddisruptionbudget será implantado no cluster Kubernetes. true

Próximos passos

Para obter mais detalhes sobre como instalar aplicativos com o Helm no Serviço Kubernetes do Azure (AKS), visite aqui.