Cuando despliega Stable Diffusion en un clúster ACK con Knative, este último le permite controlar con precisión la cantidad de solicitudes concurrentes que procesa un pod individual según su rendimiento. Esto garantiza la estabilidad del servicio. Además, Knative escala automáticamente los pods a cero cuando no hay tráfico, lo que reduce los costos de recursos de GPU.
Requisitos previos
-
Creó un clúster ACK que incluye nodos GPU. El clúster debe ejecutar Kubernetes 1.24 o una versión posterior. Para obtener más información, consulte Create an ACK managed cluster.
Se recomiendan los siguientes tipos de instancia: ecs.gn5-c4g1.xlarge, ecs.gn5i-c8g1.2xlarge o ecs.gn5-c8g1.2xlarge.
Desplegó Knative en el clúster. Para obtener más información, consulte Deploy and manage Knative components.
Funcionamiento
Debe cumplir con los acuerdos de usuario, las especificaciones de uso y las leyes y normativas aplicables del modelo Stable Diffusion de terceros. Alibaba Cloud no garantiza la legalidad, seguridad ni exactitud del modelo Stable Diffusion, y no asume ninguna responsabilidad por los daños derivados de su uso.
Stable Diffusion genera escenas e imágenes objetivo de forma rápida y precisa. Sin embargo, los entornos de producción suelen tener los siguientes requisitos:
Un pod individual tiene un rendimiento limitado. Procesar varias solicitudes concurrentes puede sobrecargarlo. Por lo tanto, es necesario controlar con precisión la cantidad de solicitudes concurrentes por pod.
Los recursos de GPU son costosos. Se deben asignar bajo demanda y liberar rápidamente durante las horas de menor actividad.
ACK Knative admite la programación precisa basada en la cantidad de solicitudes concurrentes e implementa el escalado automático para construir un servicio Stable Diffusion apto para producción. La siguiente figura ilustra este proceso.
Paso 1: Desplegar el servicio Stable Diffusion
Asegúrese de que el servicio Stable Diffusion se despliegue en nodos GPU. De lo contrario, el servicio no funcionará.
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en .
-
Despliegue el servicio Stable Diffusion.
ACK Knative proporciona plantillas de aplicaciones populares. Utilice una plantilla de aplicación para desplegar rápidamente o despliegue el servicio mediante YAML.
Plantilla de aplicación
Haga clic en la pestaña Popular Apps y luego en Deploy en la tarjeta del servicio Stable Diffusion.
Una vez completado el despliegue, haga clic en la pestaña Services para consultar el progreso en la lista de servicios. El servicio queda desplegado cuando Status muestra Success.
YAML
Haga clic en la pestaña Services, seleccione default en la lista desplegable Namespace y luego haga clic en Create from Template. Pegue el siguiente ejemplo de YAML en la plantilla y haga clic en Create para crear un servicio llamado stable-diffusion.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: stable-diffusion annotations: serving.knative.dev.alibabacloud/affinity: "cookie" serving.knative.dev.alibabacloud/cookie-name: "sd" serving.knative.dev.alibabacloud/cookie-timeout: "1800" spec: template: metadata: annotations: autoscaling.knative.dev/class: kpa.autoscaling.knative.dev autoscaling.knative.dev/maxScale: '10' autoscaling.knative.dev/targetUtilizationPercentage: "100" k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge,ecs.gn5i-c8g1.2xlarge,ecs.gn5-c8g1.2xlarge spec: containerConcurrency: 1 containers: - args: - --listen - --skip-torch-cuda-test - --api command: - python3 - launch.py image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion@sha256:62b3228f4b02d9e89e221abe6f1731498a894b042925ab8d4326a571b3e992bc imagePullPolicy: IfNotPresent ports: - containerPort: 7860 name: http1 protocol: TCP name: stable-diffusion readinessProbe: tcpSocket: port: 7860 initialDelaySeconds: 5 periodSeconds: 1 failureThreshold: 3En la página Services, el nombre de dominio predeterminado del servicio stable-diffusion es
stable-diffusion.default.example.com.
Paso 2: Acceder al servicio
-
En la pestaña Services, obtenga los valores de Gateway y Default Domain del servicio.
NotaSi el tipo de gateway es ALB Gateway, utilice el comando
curlpara acceder a la dirección del servicio. El formato es el siguiente:curl -H "Host: stable-diffusion.default.example.com" http://alb-XXX.cn-hangzhou.alb.aliyuncsslb.com # Replace the placeholder with your ALB Gateway address.Para acceder directamente al servicio mediante su nombre de dominio, configure a CNAME record for the ALB instance.
-
Por ejemplo:
47.xx.xxx.xx stable-diffusion.default.example.com # Replace the placeholder with the gateway IP address. -
Después de configurar la asignación del host, vaya a la pestaña Services y haga clic en el nombre de dominio predeterminado del servicio stable-diffusion.
Ahora puede acceder a Stable Diffusion directamente mediante su nombre de dominio.
Si el acceso es exitoso, el navegador mostrará la página txt2img de la interfaz web de Stable Diffusion y la barra de direcciones presentará el nombre de dominio del servicio Knative. Introduzca un texto en el cuadro de solicitud positiva (positive prompt), como
cat, y haga clic en Generate. Si se genera la imagen de IA correspondiente, el servicio de inference de Stable Diffusion desplegado por Knative funciona correctamente.
Paso 3: Comprobar el escalado automático basado en solicitudes
-
Ejecute una prueba de estrés con la herramienta de pruebas de carga Hey.
NotaPara obtener más información sobre la herramienta de pruebas de carga Hey, consulte Hey.
hey -n 50 -c 5 -t 180 -m POST -H "Content-Type: application/json" -d '{"prompt": "pretty dog"}' http://stable-diffusion.default.example.com/sdapi/v1/txt2imgEste comando envía 50 solicitudes con un nivel de concurrencia de 5 y un tiempo de espera de 180 segundos.
Resultado esperado:
Summary: Total: 252.1749 secs Slowest: 62.4155 secs Fastest: 9.9399 secs Average: 23.9748 secs Requests/sec: 0.1983 Response time histogram: 9.940 [1] |■■ 15.187 [17] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 20.435 [9] |■■■■■■■■■■■■■■■■■■■■■ 25.683 [11] |■■■■■■■■■■■■■■■■■■■■■■■■■■ 30.930 [1] |■■ 36.178 [1] |■■ 41.425 [3] |■■■■■■■ 46.673 [1] |■■ 51.920 [2] |■■■■■ 57.168 [1] |■■ 62.415 [3] |■■■■■■■ Latency distribution: 10% in 10.4695 secs 25% in 14.8245 secs 50% in 20.0772 secs 75% in 30.5207 secs 90% in 50.7006 secs 95% in 61.5010 secs 0% in 0.0000 secs Details (average, fastest, slowest): DNS+dialup: 0.0424 secs, 9.9399 secs, 62.4155 secs DNS-lookup: 0.0385 secs, 0.0000 secs, 0.3855 secs req write: 0.0000 secs, 0.0000 secs, 0.0004 secs resp wait: 23.8850 secs, 9.9089 secs, 62.3562 secs resp read: 0.0471 secs, 0.0166 secs, 0.1834 secs Status code distribution: [200] 50 responsesEl resultado muestra que se enviaron 50 solicitudes y que la tasa de éxito es del 100 %.
-
Ejecute el siguiente comando para observar el escalado automático de pods en tiempo real:
watch -n 1 'kubectl get po'Durante la prueba de estrés, la cantidad de pods se escala automáticamente a cinco y el estado de todos los pods es Running.
Como la concurrencia máxima de un solo pod se estableció en 1 (
containerConcurrency: 1), el servicio Stable Diffusion escala horizontalmente de forma automática hasta 5 pods durante la prueba de estrés.
Paso 4: Consultar los datos de monitoreo del servicio
Knative ofrece capacidades de observability listas para usarse. En la página Knative, haga clic en la pestaña Monitoring Dashboards para consultar los datos de monitoreo del servicio Stable Diffusion. Para obtener más información sobre cómo habilitar y usar el Monitoring Dashboard de Knative, consulte View the Knative Monitoring Dashboard.
Documentación relacionada
Para conocer las recomendaciones de configuración al desplegar servicios de inference de modelos de IA con Knative, consulte Best practices for deploying AI model inference services in Knative.