Triển khai Prometheus và Grafana để thu thập metrics
Chúng ta sẽ cài đặt Prometheus và Grafana trong namespace monitoring để tập trung thu thập dữ liệu hiệu năng từ các Pod vLLM và TensorRT-LLM.
Bước này tạo nền tảng để lưu trữ time-series data và hiển thị trực quan các chỉ số hoạt động của cụm AI.
Tạo namespace riêng biệt cho hệ thống giám sát để cách ly tài nguyên và quyền truy cập.
kubectl create namespace monitoring
Kết quả mong đợi: Namespace monitoring được tạo thành công, sẵn sàng chứa các component giám sát.
Triển khai Prometheus qua Helm chart, cấu hình để nó tự động phát hiện các Service trong cluster có label prometheus.io/scrape.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/prometheus --namespace monitoring --set server.persistentVolume.enabled=false --set server.retention=24h --set server.resources.requests.cpu=500m --set server.resources.requests.memory=2Gi
Kết quả mong đợi: Pod prometheus-prometheus-server chạy ở trạng thái Running và có Service prometheus-prometheus-server expose port 9090.
Triển khai Grafana để liên kết với Prometheus làm nguồn dữ liệu (Data Source).
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana --namespace monitoring --set persistence.enabled=false --set adminPassword=admin --set service.type=ClusterIP
Kết quả mong đợi: Pod grafana chạy ổn định, có thể truy cập dashboard qua port-forward.
Cấu hình Data Source trong Grafana để kết nối với Prometheus bằng cách tạo file ConfigMap.
cat > /tmp/grafana-datasources.yaml
Kết quả mong đợi: ConfigMap được áp dụng, Grafana tự động load data source Prometheus khi khởi động.
Verify kết quả
Port-forward để truy cập Grafana và kiểm tra xem Prometheus đã xuất hiện trong danh sách Data Sources chưa.
kubectl port-forward -n monitoring svc/grafana 3000:3000
Mở trình duyệt truy cập http://localhost:3000, đăng nhập với user admin và password admin. Vào menu Configuration -> Data Sources để xác nhận Prometheus đã được cấu hình.
Cấu hình Exporter NVIDIA DCGX để theo dõi GPU
Để Prometheus đọc được thông số phần cứng như nhiệt độ (Temperature), Utilization, và Memory Usage của GPU, chúng ta cần triển khai NVIDIA DCGX Exporter.
Component này sẽ scrape dữ liệu từ driver NVIDIA và chuyển đổi thành định dạng Prometheus metrics.
Triển khai NVIDIA DCGX Exporter thông qua Helm chart chính thức từ NVIDIA.
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm install nvidia-dcgm-exporter nvidia/dcgm-exporter --namespace monitoring --set image.registry=nvcr.io --set image.repository=ai/dcgm-exporter --set image.tag=3.3.6-2.3.1-ubi --set tolerations[0].key=nvidia.com/gpu --set tolerations[0].operator=Exists
Kết quả mong đợi: Pod nvidia-dcgm-exporter chạy trên các node có GPU (do tolerations), expose port 9400.
Cấu hình ServiceMonitor để Prometheus tự động phát hiện và scrape metrics từ DCGM Exporter.
cat > /tmp/dcgm-service-monitor.yaml
Kết quả mong đợi: Prometheus sẽ xuất hiện target mới dcgm-exporter trong tab Targets của Prometheus UI.
Tạo ConfigMap để map các metric của DCGM sang các tên metric chuẩn của Prometheus (ví dụ: nvidia_gpu_utilization).
cat > /tmp/dcgm-metrics-config.yaml
Kết quả mong đợi: ConfigMap được tạo. Lưu ý: DCGM Exporter thường tự động expose các metric này, file config này dùng để tùy chỉnh nếu cần map lại tên.
Verify kết quả
Truy cập Prometheus UI (port-forward port 9090) và vào tab Targets.
kubectl port-forward -n monitoring svc/prometheus-prometheus-server 9090:9090
Xác nhận target nvidia-dcgm-exporter có trạng thái UP. Truy cập http://localhost:9090/graph và query nvidia_gpu_utilization để xem biểu đồ utilization của GPU theo thời gian thực.
Thiết lập dashboard theo dõi thông số AI inference
Chúng ta sẽ import các dashboard tiêu chuẩn cho vLLM và tạo dashboard custom để theo dõi các chỉ số quan trọng: TPS (Tokens Per Second), Latency, và KV Cache Hit Rate.
vLLM tự động expose các metrics này, chỉ cần cấu hình Grafana để hiển thị đúng cách.
Import dashboard chính thức cho vLLM (ID: 16699 hoặc tương đương mới nhất từ cộng đồng) vào Grafana.
curl -s https://raw.githubusercontent.com/vllm-project/vllm/main/docs/source/examples/dashboard/vllm-dashboard.json | kubectl apply -f - --namespace monitoring 2>/dev/null || echo "Dashboard JSON cần import thủ công qua UI hoặc ConfigMap"
Kết quả mong đợi: Nếu dùng ConfigMap, dashboard sẽ tự load. Nếu không, bước này nhắc nhở cần upload file JSON vào Grafana UI.
Tạo Dashboard Custom cho các chỉ số AI bằng cách định nghĩa các Query PromQL trong file JSON ConfigMap.
cat > /tmp/ai-inference-dashboard.yaml
Kết quả mong đợi: Dashboard AI Inference Performance xuất hiện trong danh sách Dashboard của Grafana.
Cấu hình vLLM Pod để expose metrics endpoint đúng cách nếu chưa được cấu hình trong Part 3.
kubectl patch deployment vllm-deployment --type=merge -p '{"spec":{"template":{"spec":{"containers":[{"name":"vllm","ports":[{"containerPort":8000,"name":"http"},{"containerPort":8001,"name":"metrics"}]}]}}}}'
Kết quả mong đợi: Pod vLLM sẽ expose port 8001 cho metrics, đảm bảo Prometheus có thể scrape được.
Verify kết quả
Vào Grafana Dashboard, chọn AI Inference Performance.
Gửi một request thử nghiệm đến service vLLM để kích hoạt metrics:
curl -X POST http://localhost:8000/v1/completions -d '{
"model": "llama2-7b",
"prompt": "The capital of France is",
"max_tokens": 10,
"temperature": 0
}' -H "Content-Type: application/json"
Xác nhận các panel trong dashboard hiển thị giá trị thay đổi (TPS tăng, Latency hiện diện) ngay sau khi gửi request.
Cấu hình Loki và Promtail để tập trung log
Để phân tích sự cố và audit, chúng ta cần tập trung log từ các container vLLM và TensorRT-LLM vào Loki.
Log sẽ chứa thông tin chi tiết về lỗi inference, warning về memory, và trace request.
Triển khai Loki và Promtail trong namespace monitoring để thu thập log từ toàn bộ cluster.
helm install loki grafana/loki-stack --namespace monitoring --set grafana.enabled=false --set promtail.enabled=true --set loki.storage.backend=boltdb-shipper --set loki.retention_period=24h
Kết quả mong đợi: Pod loki và promtail chạy, Loki expose port 3100.
Cấu hình Promtail để đọc log từ container vLLM và TensorRT-LLM dựa trên label app.
cat > /tmp/promtail-config.yaml
Kết quả mong đợi: ConfigMap được áp dụng, Promtail sẽ bắt đầu đọc file log từ node.
Deploy Promtail dưới dạng DaemonSet để đảm bảo nó chạy trên mọi node có pod AI inference, sử dụng ConfigMap ở trên.
cat > /tmp/promtail-daemonset.yaml
Kết quả mong đợi: DaemonSet promtail chạy trên tất cả các node, thu thập log từ container vLLM/TRT-LLM.
Cấu hình Loki làm Data Source trong Grafana để truy vấn log.
cat > /tmp/grafana-loki-datasource.yaml
Kết quả mong đợi: Data source Loki xuất hiện trong Grafana.
Verify kết quả
Vào Grafana, chọn tab Explore.
Chọn Data Source Loki và query:
{job="vllm"}
Xác nhận xuất hiện dòng log từ container vLLM (ví dụ: INFO khi nhận request, ERROR nếu có lỗi). Làm tương tự với {job="trt-llm"}.
Tạo Alert rule khi độ trễ vượt ngưỡng hoặc GPU bị lỗi
Chúng ta sẽ định nghĩa các quy tắc cảnh báo (Alert Rules) trong Prometheus để gửi thông báo khi hệ thống gặp sự cố nghiêm trọng.
Các ngưỡng cảnh báo bao gồm: Latency p95 > 500ms, GPU Temperature > 85°C, hoặc Pod vLLM bị CrashLoop.
Tạo file Alert Rule trong ConfigMap để định nghĩa logic cảnh báo.
cat > /tmp/alert-rules.yaml 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "High latency detected in AI Inference"
description: "P95 latency is {{ $value }}s (threshold: 0.5s) for service vLLM."
- alert: HighGPUTemperature
expr: nvidia_gpu_temperature > 85
for: 5m
labels:
severity: critical
annotations:
summary: "GPU Overheating"
description: "GPU {{ $labels.instance }} temperature is {{ $value }}°C."
- alert: LowKVCacheHitRate
expr: (sum(rate(vllm:kv_cache_hit[5m])) / sum(rate(vllm:kv_cache_miss[5m]))) < 0.1
for: 10m
labels:
severity: warning
annotations:
summary: "Low KV Cache Hit Rate"
description: "KV Cache Hit Rate is below 10%, indicating inefficient memory usage."
- alert: PodCrashLoop
expr: kube_pod_status_phase{phase="Running"} == 0 and kube_pod_status_container_restarts > 3
for: 5m
labels:
severity: critical
annotations:
summary: "Pod is restarting frequently"
description: "Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has restarted {{ $value }} times."
EOF
kubectl apply -f /tmp/alert-rules.yaml
Kết quả mong đợi: PrometheusRule được tạo, Prometheus tải các rules mới vào và bắt đầu đánh giá.
Cấu hình Alertmanager để nhận các alert từ Prometheus và định tuyến chúng (ví dụ: gửi vào Slack hoặc Email).
helm install alertmanager prometheus-community/alertmanager --namespace monitoring --set config.alertmanager.yml="route:\n group_wait: 10s\n group_interval: 10s\n repeat_interval: 1h\n receiver: 'slack-notifications'\nreceivers:\n- name: 'slack-notifications'\n slack_configs:\n - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'\n channel: '#ai-alerts'\n title: '{{ .CommonLabels.alertname }}'\n text: '{{ .CommonAnnotations.description }}'\n send_resolved: true"
Kết quả mong đợi: Alertmanager chạy, sẵn sàng nhận alert từ Prometheus. (Lưu ý: Thay thế webhook URL bằng URL thật của bạn).
Liên kết Prometheus với Alertmanager để gửi alert.
helm upgrade prometheus prometheus-community/prometheus --namespace monitoring --set alertmanager.enabled=true --set alertmanager.serviceMonitor.enabled=true --set alertmanager.alertmanagerSpec.externalUrl=http://alertmanager.monitoring.svc.cluster.local:9093
Kết quả mong đợi: Prometheus tự động phát hiện Alertmanager và thêm endpoint http://alertmanager.monitoring.svc.cluster.local:9093 vào cấu hình remote_write.
Verify kết quả
Vào Prometheus UI, chọn tab Alerting.
Tìm rule HighInferenceLatency hoặc HighGPUTemperature.
Để test, giả lập tình huống GPU nóng (nếu có tool giả lập) hoặc đợi traffic cao. Nếu không, có thể tạo một rule test tạm thời:
kubectl edit prometheusrule ai-inference-alerts -n monitoring
Thêm rule AlwaysFiring với expr vector(1) để kiểm tra Alertmanager có gửi thông báo không.
Kiểm tra tab Alerts trong Prometheus UI xem trạng thái có chuyển thành Firing không, và kiểm tra kênh Slack/Email đã nhận tin nhắn chưa.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng AI inference hiệu năng cao với vLLM, TensorRT-LLM và Kubernetes trên Proxmox
« Phần 6: Quản lý dữ liệu và caching model với NVMe và Shared Storage
Phần 8: Triển khai đa model và quản lý phiên bản với Model Registry »