Além dos recursos de roteamento de tráfego de LLM descritos no tópico anterior, o ASM aprimora a observabilidade para cenários de LLM. Este tópico explica como usar o log de acesso e as métricas de monitoramento do ASM para observar informações de requisições de LLM.
Para demonstrar todos os recursos, este tópico pressupõe que você concluiu todas as etapas em Roteamento de tráfego: Use o ASM para gerenciar eficientemente o tráfego de LLM. Caso tenha concluído apenas a Etapa 1 e a Etapa 2 daquele tópico, ainda é possível enviar requisições de teste com os comandos da Etapa 2. Os comandos para visualizar dados de observabilidade são os mesmos apresentados neste tópico.
Etapa 1: Observe requisições de LLM com logs de acesso
Configure o log de acesso
O ASM aprimora o registro de logs para requisições de LLM. Para visualizar essas informações no log de acesso, atualize o formato do log de acesso personalizado. Para mais informações, consulte log de acesso personalizado do plano de dados.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
Nas configurações globais de Log Settings, adicione os três campos a seguir.
Conteúdo de texto:
request_model FILTER_STATE(wasm.asm.llmproxy.request_model:PLAIN) request_prompt_tokens FILTER_STATE(wasm.asm.llmproxy.request_prompt_tokens:PLAIN) request_completion_tokens FILTER_STATE(wasm.asm.llmproxy.request_completion_tokens:PLAIN)Definição dos campos:
request_model: Modelo efetivamente usado na requisição de LLM atual, como
qwen-turboouqwen1.5-72b-chat.request_prompt_tokens: Quantidade de tokens de entrada da requisição.
request_completion_tokens: Quantidade de tokens de saída da requisição.
A maioria dos provedores de serviços de LLM cobra com base no uso de tokens. Esses dados permitem rastrear requisições que consomem tokens e identificar os modelos utilizados.
Verificação
-
Com o kubeconfig do seu cluster ACK, execute separadamente os dois comandos abaixo.
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }'kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --header 'user-type: subscriber' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }' -
Execute o comando a seguir para visualizar o log de acesso.
kubectl logs deployments/sleep -c istio-proxy | tail -2Saída esperada:
{"bytes_received":"85","bytes_sent":"617","downstream_local_address":"47.93.xxx.xx:80","downstream_remote_address":"192.168.34.235:39066","duration":"7640","istio_policy_status":"-","method":"POST","path":"/compatible-mode/v1/chat/completions","protocol":"HTTP/1.1","request_id":"d0e17f66-f300-411a-8c32-xxxxxxxxxxxxx","requested_server_name":"-","response_code":"200","response_flags":"-","route_name":"-","start_time":"2024-07-12T03:20:03.993Z","trace_id":"-","upstream_cluster":"outbound|80||dashscope.aliyuncs.com","upstream_host":"47.93.xxx.xx:443","upstream_local_address":"192.168.34.235:38476","upstream_service_time":"7639","upstream_response_time":"7639","upstream_transport_failure_reason":"-","user_agent":"curl/8.8.0","x_forwarded_for":"-","authority_for":"dashscope.aliyuncs.com","request_model":"qwen1.5-72b-chat","request_prompt_tokens":"3","request_completion_tokens":"55"} {"bytes_received":"85","bytes_sent":"809","downstream_local_address":"47.93.xxx.xx:80","downstream_remote_address":"192.168.34.235:41090","duration":"2759","istio_policy_status":"-","method":"POST","path":"/compatible-mode/v1/chat/completions","protocol":"HTTP/1.1","request_id":"d89faada-6af3-4ac3-b4fd-xxxxxxxxxxxxx","requested_server_name":"-","response_code":"200","response_flags":"-","route_name":"vip-route","start_time":"2024-07-12T03:20:30.854Z","trace_id":"-","upstream_cluster":"outbound|80||dashscope.aliyuncs.com","upstream_host":"47.93.xxx.xx:443","upstream_local_address":"192.168.34.235:38476","upstream_service_time":"2759","upstream_response_time":"2759","upstream_transport_failure_reason":"-","user_agent":"curl/8.8.0","x_forwarded_for":"-","authority_for":"dashscope.aliyuncs.com","request_model":"qwen-turbo","request_prompt_tokens":"11","request_completion_tokens":"90"} -
Após a formatação, o conteúdo do log fica assim:
{ "duration": "7640", "response_code": "200", "authority_for": "dashscope.aliyuncs.com", --Actual LLM provider accessed "request_model": "qwen1.5-72b-chat", --Model used by the current request "request_prompt_tokens": "3", --Number of input tokens for the current request "request_completion_tokens": "55" --Number of output tokens for the current request }{ "duration": "2759", "response_code": "200", "authority_for": "dashscope.aliyuncs.com", --Actual LLM provider accessed "request_model": "qwen-turbo", --Model used by the current request "request_prompt_tokens": "11", --Number of input tokens for the current request "request_completion_tokens": "90" --Number of output tokens for the current request }
O ASM integra-se ao SLS. Ao coletar e armazenar esses logs de acesso, você observa chamadas de LLM no nível de requisição, define regras de alerta personalizadas e cria painéis informativos. Para mais informações, consulte Ativar coleta de logs do plano de dados.
Etapa 2: Adicione métricas para consumo de tokens
Enquanto o log de acesso fornece informações detalhadas, as métricas de monitoramento oferecem uma visão de alto nível. O proxy de malha do ASM exporta o consumo de tokens no nível de carga de trabalho como métricas de monitoramento, permitindo observar o uso de tokens de uma carga de trabalho em tempo real.
O ASM adiciona duas novas métricas:
asm_llm_proxy_prompt_tokens: Quantidade de tokens de entrada.
asm_llm_proxy_completion_tokens: Quantidade de tokens de saída.
Por padrão, essas duas métricas possuem as seguintes dimensões:
llmproxy_source_workload: Nome da carga de trabalho que envia a requisição.
llmproxy_source_workload_namespace: Namespace onde a origem da requisição está localizada.
llmproxy_destination_service: Provedor de destino.
llmproxy_model: Modelo da requisição atual.
Modifique a configuração da carga de trabalho para gerar novas métricas
Esta etapa usa o deployment sleep no namespace default como exemplo.
-
Use o arquivo kubeconfig do seu cluster ACK para criar um arquivo chamado
asm-llm-proxy-bootstrap-config.yaml.apiVersion: v1 kind: ConfigMap metadata: name: asm-llm-proxy-bootstrap-config data: custom_bootstrap.json: | "stats_config": { "stats_tags":[ { "tag_name": "llmproxy_source_workload", "regex": "(\\|llmproxy_source_workload=([^|]*))" }, { "tag_name": "llmproxy_source_workload_namespace", "regex": "(\\|llmproxy_source_workload_namespace=([^|]*))" }, { "tag_name": "llmproxy_destination_service", "regex": "(\\|llmproxy_destination_service=([^|]*))" }, { "tag_name": "llmproxy_model", "regex": "(\\|llmproxy_model=([^|]*))" } ] } -
Execute o comando a seguir para criar um ConfigMap chamado
asm-llm-proxy-bootstrap-config.kubectl apply -f asm-llm-proxy-bootstrap-config.yaml -
Execute o comando a seguir para modificar o deployment
sleepe adicionar uma anotação ao pod.kubectl patch deployment sleep -p '{"spec":{"template":{"metadata":{"annotations":{"sidecar.istio.io/bootstrapOverride":"asm-llm-proxy-bootstrap-config"}}}}}'
Verificação
-
Execute separadamente os dois comandos a seguir para enviar requisições de teste.
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }'kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --header 'user-type: subscriber' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }' -
Execute o comando a seguir para visualizar as métricas do Prometheus exportadas pelo sidecar da aplicação
sleep.kubectl exec deployments/sleep -it -c istio-proxy -- curl localhost:15090/stats/prometheus | grep llmproxySaída esperada:
asm_llm_proxy_completion_tokens{llmproxy_source_workload="sleep",llmproxy_source_workload_namespace="default",llmproxy_destination_service="dashscope.aliyuncs.com",llmproxy_model="qwen1.5-72b-chat"} 72 asm_llm_proxy_completion_tokens{llmproxy_source_workload="sleep",llmproxy_source_workload_namespace="default",llmproxy_destination_service="dashscope.aliyuncs.com",llmproxy_model="qwen-turbo"} 85 asm_llm_proxy_prompt_tokens{llmproxy_source_workload="sleep",llmproxy_source_workload_namespace="default",llmproxy_destination_service="dashscope.aliyuncs.com",llmproxy_model="qwen1.5-72b-chat"} 3 asm_llm_proxy_prompt_tokens{llmproxy_source_workload="sleep",llmproxy_source_workload_namespace="default",llmproxy_destination_service="dashscope.aliyuncs.com",llmproxy_model="qwen-turbo"} 11A saída confirma que o sidecar exporta as métricas, cada uma incluindo quatro dimensões padrão.
O ASM integra-se ao ARMS. Para análises e visualizações mais detalhadas, configure regras de coleta para enviar essas métricas ao Managed Service for Prometheus. Para mais informações, consulte Coletar métricas de monitoramento no Managed Service for Prometheus.
Etapa 3: Adicione dimensões de LLM às métricas nativas
A malha de serviço fornece diversas métricas padrão que exibem informações detalhadas para protocolos HTTP e TCP. Essas métricas oferecem uma grande variedade de dimensões, e o ASM disponibiliza painéis nativos robustos para Prometheus baseados nelas.
No entanto, essas métricas não contêm informações sobre requisições de LLM. Para resolver isso, o ASM permite adicionar informações de requisições de LLM às métricas existentes por meio da personalização de suas dimensões.
Configure uma dimensão personalizada: model
Esta seção demonstra como adicionar a dimensão model à métrica REQUEST_COUNT.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
Clique em Edit Dimension para Edit dimension, selecione a aba Custom Dimension e clique em Custom Dimensions. Defina Dimension Name como
modele Value comofilter_state["wasm.asm.llmproxy.request_model"].
Verificação
-
Execute separadamente os dois comandos a seguir para enviar requisições de teste.
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }'kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --header 'user-type: subscriber' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself"} ] }' -
Execute o comando a seguir para visualizar as métricas do Prometheus exportadas pelo sidecar da aplicação
sleep.kubectl exec deployments/sleep -it -c istio-proxy -- curl localhost:15090/stats/prometheus | grep istio_requests_totalSaída esperada:
istio_requests_total{reporter="source",source_workload="sleep",source_canonical_service="sleep",source_canonical_revision="latest",source_workload_namespace="default",source_principal="unknown",source_app="sleep",source_version="",source_cluster="cce8d2c1d1e8d4abc8d5c180d160669cc",destination_workload="unknown",destination_workload_namespace="unknown",destination_principal="unknown",destination_app="unknown",destination_version="unknown",destination_service="dashscope.aliyuncs.com",destination_canonical_service="unknown",destination_canonical_revision="latest",destination_service_name="dashscope.aliyuncs.com",destination_service_namespace="unknown",destination_cluster="unknown",request_protocol="http",response_code="200",grpc_response_status="",response_flags="-",connection_security_policy="unknown",model="qwen1.5-72b-chat"} 1 istio_requests_total{reporter="source",source_workload="sleep",source_canonical_service="sleep",source_canonical_revision="latest",source_workload_namespace="default",source_principal="unknown",source_app="sleep",source_version="",source_cluster="cce8d2c1d1e8d4abc8d5c180d160669cc",destination_workload="unknown",destination_workload_namespace="unknown",destination_principal="unknown",destination_app="unknown",destination_version="unknown",destination_service="dashscope.aliyuncs.com",destination_canonical_service="unknown",destination_canonical_revision="latest",destination_service_name="dashscope.aliyuncs.com",destination_service_namespace="unknown",destination_cluster="unknown",request_protocol="http",response_code="200",grpc_response_status="",response_flags="-",connection_security_policy="unknown",model="qwen-turbo"} 1A saída confirma que a dimensão
modelfoi adicionada à métricaistio_requests_total.Com essas métricas de monitoramento, é possível configurar regras de análise no ARMS para obter insights mais profundos. Por exemplo:
Taxa de sucesso de requisições para um modelo específico.
Latência média de resposta para um modelo ou provedor específico.
Conclusão
Este tópico complementa o conteúdo de Roteamento de tráfego: Use o ASM para gerenciar eficientemente o tráfego de LLM e descreve como realizar observações detalhadas e de alto nível do tráfego de LLM usando o ASM. É possível ativar recursos de observabilidade multidimensional com apenas pequenas modificações na configuração do seu cluster. O ASM aprimora continuamente suas capacidades de observabilidade para tráfego de LLM, visando oferecer soluções mais detalhadas e flexíveis.