使用Knative在ACK集群中部署Stable Diffusion时,Knative支持根据单个Pod处理请求的吞吐率精准地控制单个Pod请求并发处理数,保证服务稳定性,还能在业务没有流量时自动将实例缩容至零,节省GPU资源的使用成本。
前提条件
已创建包含GPU节点的ACK集群,且集群版本为1.24及以上。具体操作,请参见创建Kubernetes托管版集群。
推荐选择机型为ecs.gn5-c4g1.xlarge、ecs.gn5i-c8g1.2xlarge或ecs.gn5-c8g1.2xlarge。
已在集群中部署Knative,请参见部署Knative。
实现流程
您应当自觉遵守第三方模型Stable Diffusion的用户协议、使用规范和相关法律法规,阿里云不对Stable Diffusion模型的合法性、安全性、准确性进行任何保证,且不对由此引发的任何损害承担责任。
随着生成型AI技术能力的提升,大家越来越关注通过AI模型提升研发效率。Stable Diffusion作为AIGC领域的知名项目,可以帮助您快速、准确地生成所需场景及图片。但目前使用Stable Diffusion会面临如下问题:
单个Pod处理请求的吞吐率有限,如果多个请求转发到同一个Pod,会导致服务端过载异常,因此需要精准地控制单个Pod请求并发处理数。
由于GPU资源很珍贵,期望做到按需使用资源,并在业务低谷及时释放GPU资源。
基于以上两个问题,阿里云容器服务提供Knative解决方案,可以做到基于并发请求数精准处理,实现自动弹性扩缩容,打造生产可用的Stable Diffusion服务。具体实现流程如下所示。
步骤一:部署Stable Diffusion服务
您需确保Stable Diffusion服务被正确部署在GPU节点上,否则服务将无法使用。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
部署Stable Diffusion服务。
ACK Knative提供了热门应用模板。您可以通过应用模板快速部署,也可以通过YAML来部署。
应用模板
单击热门应用页签,在Stable Diffusion服务的卡片上完成一键部署。
部署后,您可以单击服务管理,在服务列表查看部署进度。
如图所示,表明服务已部署成功。
YAML
单击服务管理页签,选择命名空间为default,然后单击使用模板创建,将以下YAML示例粘贴至模板,最后单击创建,创建一个名为knative-sd-demo的服务。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: knative-sd-demo 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: 3
如图所示,表明knative-sd-demo服务已部署成功。
步骤二:访问服务
在服务管理页签,获取服务的访问网关和默认域名。
将knative-sd-demo服务的网关地址与需要访问的域名进行Host绑定,在Hosts文件中添加绑定信息。绑定示例如下。
47.xx.xxx.xx knative-sd-demo.default.example.com # 替换为实际的网关IP和域名。
完成Host绑定后,在服务管理页签,单击knative-sd-demo服务的默认域名,即可访问Stable Diffusion。
如图所示,可通过域名直接对Stable Diffusion进行访问。
步骤三:基于请求实现自动弹性扩缩容
使用Hey压测工具,执行压测。
说明Hey压测工具的详细介绍,请参见Hey。
hey -n 50 -c 5 -t 180 -m POST -H "Content-Type: application/json" -d '{"prompt": "pretty dog"}' http://knative-sd-demo.default.example.com/sdapi/v1/txt2img
发送50个请求,并发数为5,请求超时时间为180秒。
预期输出:
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 responses
可以看到持续发送了50个请求,请求成功率为100%。
执行如下命令,可实时观察Pod扩缩容情况。
watch -n 1 'kubectl get po'
由于部署Stable Diffusion服务时配置了单Pod的最大并发数是1 (
containerConcurrency: 1
),因此压测期间自动扩容了5个Pod。
步骤四:查看Stable Diffusion服务监控数据
Knative提供开箱即用的可观测能力,在Knative页面,单击监控大盘页签,即可查看Stable Diffusion服务的监控数据情况。如何开启Knative监控大盘,请参见查看Knative服务监控大盘。
在Overview (average over the selected time range)区域,可查看Stable Diffusion服务的请求量(Request Volume)、请求成功率(Success Rate)、4xx(客户端错误)、5xx(服务器端错误)和Pod扩缩容趋势的监控数据。
在Response Time区域,查看Knative的响应延迟数据,包括P50、P90、P95和P99。
相关文档
如果您需要在Knative中部署AI模型推理服务,可参见在Knative中部署AI模型推理服务的最佳实践获取配置建议。