产品定义
云原生 AI 套件通过多个可组装、可扩展、可定制的组件来提供云原生 AI 能力。以 Kubernetes 容器服务为底座,向下封装对各类异构资源的统一管理,向上提供标准 Kubernetes 集群环境和 API,运行各个核心组件。并结合容器镜像服务,以及可观测、智能诊断、弹性伸缩等容器服务相关能力,提供更加全面的产品方案。使用云原生AI套件,您可以充分利用云原生架构和技术,在Kubernetes容器平台上快速定制化构建AI生产系统,并为AI/ML应用和系统提供全栈优化。
能力优势
从上图可以很直观清晰的看出云原生AI套件有四大分层能力模块,可以分别满足企业客户不同角色、不同架构层级的场景需求。
AI 工程管理模块,除了提供 Arena 命令行工具和 SDK,来屏蔽底层复杂性,简化任务管理之外,还提供简单的运维大盘和开发控制台,满足用户快速浏览集群状态、提交和查看任务的需要。
AI 数据加速模块,该模块主要通过面向云原生数据密集型应用的数据编排框架 Fluid 来支持。
AI 任务管理模块,云原生 AI 套件兼容主流 AI 框架和工具,包括 tensorflow、pytorch、JupyterLab、TF-Serving、Triton 等等,也在不断的适配新的分布式训练和推理的框架,如 deepspeed、fasttransformer 等等,能够用统一的方式提交和管理任务。同时,支持集成 Kubeflow Pipelines 或 Argo 云原生工作流引擎,为复杂的 AI 任务提供工作流编排服务。
异构算力管理模块,我们基于容器服务 ACK 提供了资源的管理运维和弹性伸缩,能够支持 CPU、GPU、vGPU、NPU、FPGA 等异构资源的统一接入、监控、诊断和成本分析,帮助运维人员降低管理大规模 GPU 的复杂度,以及提供智能的削峰填谷,减少资源浪费。
开通试用
云原生AI套件支持安装在ACK Pro版集群、ACK Serverless集群Pro版、ACK@Edge Pro版集群,且集群版本为1.18及以上。所以在开通AI套件试用前,需要开通云容器服务ACK 基础版的产品试用。前往产品试用中心,输入关键字ack。如下:
点击“立即试用”,选择合适的地域,其他默认。如下:
在没有角色授权前,“立即试用”按钮是灰色不可用的,点击“前往RAM进行授权”,在授权页面点击“同意授权”。如下:
完成授权后,再点击立即试用,完成产品试用开通流程,等待几分钟,容器服务创建完成,前往容器服务控制台。如下:
在集群列表,在服务更多选项中,点击“迁移至Pro版”。如下:
集群迁移至Pro版涉及到收费,新手请认真阅读注意事项。如下:
确认无误后,点击立即开通。如下:
点击立即开通后,再次回到迁移至Pro弹窗页,点击确定。如下:
等待几分钟,迁移完成后。如下:
此时回到集群列表,可以看到集群类型变成了Pro版。如下:
至此,产品试用已经开通成功。
场景体验
基于AI套件微调宝可梦风格StableDiffusion
首先前往资源编排ROS控制台,在页面设置配置项,单击创建。或者点击一键配置模板链接,快速开始创建。选择可用区,设置节点登录密码,单击确定。如下:
创建过程中,打开自动刷新,将每隔5秒自动刷新一次,方便观察资源创建情况。如下:
在资源栈信息页签中,显示状态为创建成功,表示快速创建成功。如下:
返回容器服务控制台,在左侧导航栏选择集群。在集群列表页面,单击在资源栈创建的集群sd-fine-tune。如下:
在左侧导航栏,选择应用 > 云原生AI套件。在云原生AI套件页面,单击开通服务。如下:
开通服务后,在云原生AI套件页面,单击一键部署。如下:
在部署页面的交互方式区域,选择控制台 > AI套件控制台,弹出提示对话框。如下:
在提示对话框中,单击如下图中的授权策略链接跳转至RAM访问控制台。如下:
在权限管理页签中,单击新增授权。如下:
在新增授权页面,单击自定义策略,然后单击新建权限策略。如下:
在创建权限策略页面,单击脚本编辑,将下列json复制到策略文档部分,单击继续编辑基本信息。如下:
{ "Version": "1", "Statement": [ { "Action": [ "ecs:DescribeInstanceAttribute", "ecs:DescribeInstances" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "log:GetProject", "log:GetLogStore", "log:GetConfig", "log:GetMachineGroup", "log:GetAppliedMachineGroups", "log:GetAppliedConfigs", "log:GetIndex", "log:GetSavedSearch", "log:GetDashboard", "log:GetJob", "ecs:DescribeInstances", "ecs:DescribeSpotPriceHistory", "ecs:DescribePrice", "eci:DescribeContainerGroups", "eci:DescribeContainerGroupPrice", "log:GetLogStoreLogs", "ims:CreateApplication", "ims:UpdateApplication", "ims:GetApplication", "ims:ListApplications", "ims:DeleteApplication", "ims:CreateAppSecret", "ims:GetAppSecret", "ims:ListAppSecretIds", "ims:ListUsers" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository", "cr:GetInstanceVpcEndpoint" ], "Resource": "*", "Effect": "Allow" } ] }
在基本信息区域,输入名称,此名称需要以k8sWorkerRolePolicy-开头(例如:k8sWorkerRolePolicy-sd-fine-tune),然后单击确定。如下:
返回如下页面,表示已成功创建权限策略。如下:
回到新增授权页面,单击刷新权限策略,单击已创建的自定义权限策略,单击确定。如下:
返回AI套件控制台,单击授权检测。如果授权成功,授权状态显示为已授权,且确定按钮可用。如下:
在提示对话框中,设置运维控制台访问方式和开发控制台访问方式,这里选择公网域名访问服务,然后单击确定。如下:
选择控制台数据存储方式。选中控制台后,在部署页面交互方式下方会出现控制台数据存储,这里选择可以选择集群内置MySQL。根据下图检查所需组件已勾选,并单击部署云原生AI套件。如下:
当界面各组件如下图所示状态时,表示云原生AI套件已完成部署。如下:
等待运维控制台准备就绪后,单击运维控制台,进入云原生AI套件运维控制台页面。如下:
在运维控制台页面,选择用户 > 用户列表,查看到默认创建的用户,单击复制并记录该用户信息的登录Token。如下:
等待开发控制台准备就绪后,单击开发控制台。如下:
选择K8s token方式登录,并输入已记录的用户登录Token,单击Login登录开发控制台。如下:
在左侧导航栏中,选择Notebook,在Notebook页面右上角,单击创建Notebook,创建新的Notebook环境。如下:
在弹出的配置页面,配置如下信息,然后单击创建Notebook。如下:
配置完成后,在返回页面中可以看到已创建的Notebook实例状态。如下:
等待Notebook实例变为Running状态后,单击Notebook实例的名称,打开JupyterLab页面。单击Notebook区域下的Python3,在环境中创建一个Notebook文件。如下:
准备stable-diffusion fine-tune环境,在该.ipynb文件中输入执行。命令如下:
#安装diffusers及模型微调需要的依赖!pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple!pipinstalltransformers==4.25.1!pipinstalldiffusers==0.18.2!pipinstallaccelerate==0.18.0torchvision==0.15.2datasets==2.13.1ftfy==6.1.1tensorboard==2.13.0Jinja2==3.0.1#下载训练需要的模型文件和数据集!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/stable-diffusion-v1-5.tar!tar-xvfstable-diffusion-v1-5.tar!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/pokemon-blip-captions.tar!tar-xvfpokemon-blip-captions.tar!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/train_text_to_image_lora.py#浏览用于训练的数据集中的图片fromdatasetsimportload_datasetdataset=load_dataset("./pokemon-blip-captions/") # 查看数据集中的第一张图片dataset['train'][0]['image'] #进行模型微调(Fine-tune)训练!acceleratelaunch--mixed_precision="fp16"train_text_to_image_lora.py \ --pretrained_model_name_or_path="./stable-diffusion-v1-5" \ --dataset_name="./pokemon-blip-captions" \ --dataloader_num_workers=8 \ --resolution=512--center_crop--random_flip \ --train_batch_size=1 \ --gradient_accumulation_steps=4 \ --max_train_steps=200 \ --learning_rate=1e-04 \ --max_grad_norm=1 \ --lr_scheduler="constant"--lr_warmup_steps=0 \ --output_dir="sd-pokemon-model-lora" \ --checkpointing_steps=500 \ --validation_epochs=25 \ --validation_prompt="Totoro" \ --seed=1337#下载webui仓库!gitclonehttps://gitcode.net/mirrors/AUTOMATIC1111/stable-diffusion-webui.git!cdstable-diffusion-webui&&gitcheckoutf865d3e11647dfd6c7b2cdf90dde24680e58acd8#将训练好的lora模型转化为webui可识别的safetensors格式!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/convert-to-safetensors.py!pythonconvert-to-safetensors.py--file='sd-pokemon-model-lora/pytorch_lora_weights.bin'!mkdirstable-diffusion-webui/models/Lora!cpsd-pokemon-model-lora/pytorch_lora_weights_converted.safetensorsstable-diffusion-webui/models/Lora/pokemon_lora_weights.safetensors#下载base model!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/v1-5-pruned-emaonly.safetensors!mvv1-5-pruned-emaonly.safetensorsstable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors#下载WebUI所需依赖!mkdir-pstable-diffusion-webui/repositories!wgethttps://yunqi-lab.oss-cn-hangzhou.aliyuncs.com/stable-diffusion/repositories.tar!tar-xfrepositories.tar-Cstable-diffusion-webui/repositories#启动WebUI!cdstable-diffusion-webui&&python-mvenv--system-site-packages--symlinksvenv!cdstable-diffusion-webui&& \ sed-i's/can_run_as_root=0/can_run_as_root=1/g'webui.sh&& \ ./webui.sh--no-download-sd-model--xformers
Stable-diffusion-webui启动后,通过http://127.0.0.1:7860访问Webui界面。在Lora版面下,选择刚刚微调训练好的Lora模型(pokemon_lora_weights),点击该Lora模型后,Prompt输入框中会自动添加如下文本: lora:pokemon_lora_weights:1。如下:
至此,一个基于云原生AI套件的应用就完成了部署。虽然部署过程很复杂,但一通操作下来,收获还是蛮大的。
- 在部署AI套件的过程中,遇到了运维控制台和开发控制台部署不成功的情况,异常报错为 failed to create resource: Internal error occurred: failed calling webhook。经过百度得知,我刚开始使用yaml的方式创建nginx-ingress,之后删除了它创建的命名空间以及 clusterrole and clusterrolebinding ,但是没有删除ValidatingWebhookConfiguration ingress-nginx-admission,这个ingress-nginx-admission是在yaml文件中安装的。当我再次使用helm安装nginx-ingress之后,创建自定义的ingress就会报这个错误。通过控制台执行kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission,再次部署即可部署成功。
- 还有一个问题是运维控制台和开发控制台部署时间过长,从点击一键部署开始过了1小时才完成,期间看不到任何异常日志和告警,对于付费实例来说,体验非常不友好。
体验总结
- 产品文档方面:(1)文档的覆盖范围:文档可能没有涵盖所有特性和功能。一些高级特性或附加功能可能没有在文档中详细说明,导致用户在某些情况下无法找到所需的信息。(2)文档的详细程度:对于某些复杂的功能或步骤,文档可能没有提供足够的细节或例子。这使得用户可能无法理解如何正确地使用这些特性。(3)文档的准确性:尽管文档可能提供了大量的信息,但某些部分可能存在错误或不一致。这可能会使信息变得不可靠,使用户难以理解和应用。(4)文档的组织结构:文档可能没有清晰的导航或组织结构,使得用户在查找特定信息时变得困难。一个清晰、一致的目录和索引可以帮助用户更快地找到所需的信息。(5)代码示例和最佳实践:虽然文档可能对产品的工作方式进行了详细的描述,但提供相关的代码示例和最佳实践是有帮助的。这可以使用户更好地理解如何在实际开发中应用产品特性。(6)术语和命名约定:文档中使用的术语和命名约定可能与用户的行业标准或习惯不同。提供一个术语表和命名约定的解释可以帮助用户更好地理解和应用这些概念。(7)用户社区和反馈:建立一个活跃的社区并接收用户反馈可以帮助发现文档中的不足并进行改进。社区可以为新手和高级用户提供一个交流和学习的平台,也可以提供额外的资源,如教程、案例研究和最佳实践。
- 产品能力方面:(1)资源运维管理:ACK 提供了一套完整的资源管理解决方案,可以方便地进行资源的分配、管理和监控。它支持多种资源类型,包括 CPU、内存、存储等,并提供了灵活的资源调度策略,能够满足多样化的业务需求。(2)AI 任务调度和弹性伸缩:ACK 提供了强大的任务调度和弹性伸缩功能,可以自动化地进行任务分配和资源扩展。它支持多种调度策略,如定时、事件触发等,并能够根据任务需求动态地调整资源规模,确保 AI 任务的稳定运行。(3)数据访问加速:ACK 提供了一系列数据加速技术,包括数据压缩、缓存、预取等,可以显著提升数据访问速度。它支持多种数据源类型,如本地、云存储、数据库等,并可自定义加速策略,适应不同的业务场景。(4)工作流编排:ACK 的工作流编排功能可以帮助用户定义、管理和执行复杂的工作流程。它支持多种编排模式,如串行、并行、条件分支等,并能够灵活地配置任务依赖关系和执行顺序,以满足各种业务需求。(5)大数据服务集成:ACK 提供了丰富的数据集成功能,可以方便地与各类大数据平台进行集成。它支持多种数据传输协议和格式,如 Flink、Kafka、CSV 等,并可自定义数据转换逻辑,实现高效、可靠的数据传输。(6)AI 作业生命周期管理:ACK 的 AI 作业管理功能可以帮助用户定义、执行和监控 AI 作业的生命周期。它支持多种作业类型,如批处理、流处理、机器学习等,并能够灵活地配置作业执行计划和监控策略,以确保 AI 作业的高效运行。(7)AI 制品管理:ACK 提供了一整套 AI 制品管理系统,可以有效地管理和追踪 AI 制品的整个生命周期。它支持多种制品类型,如模型、代码、数据集等,并可自定义制品版本控制和发布流程,以确保 AI 制品的安全和一致性。(8)统一运维:ACK 提供统一的运维管理平台,可以集中管理和监控多个设备和系统。它支持多种设备和系统类型,如服务器、网络设备、数据库等,并能够自定义运维流程和报警机制,提高运维效率和管理水平。(9)AI 数据集管理:ACK 的数据集管理功能可以帮助用户方便地创建、标注、版本控制和检索 AI 数据集。它支持多种数据格式,如 CSV、JSON、图片等,并能够自定义数据预处理和标注逻辑,以满足不同的业务需求。(10)AI 模型开发、训练、评测:ACK 提供了一站式的 AI 模型开发环境,支持从数据准备、模型设计、训练到评测的全过程。它提供了丰富的算法库和工具链,可以帮助用户快速构建和优化 AI 模型,提高模型准确率和性能。(11)模型推理服务:ACK 的模型推理服务可以帮助用户将训练好的模型部署到生产环境,并提供实时或批量推理服务。它支持多种推理模式,如在线、离线、多实例等,并能够灵活地配置服务质量和安全策略,确保模型推理的可靠性和性能。
- 产品控制台方面:(1)展示友好性:ACK 控制台的界面设计简洁明了,使用了清晰的图标和直观的布局,使得用户可以快速找到所需的功能和信息。此外,控制台提供了多语言支持,可以方便地切换到不同的语言版本,满足不同地区用户的需求。(2)操作流畅性:ACK 控制台在操作流畅性方面表现良好,用户可以快速地在不同页面和功能之间切换。此外,控制台支持批量操作和快捷键操作,进一步提高用户的工作效率。(3)提示信息完整性:控制台在提示信息方面做得不错,对于每个操作都有完整的提示和帮助文档,使用户能够清楚地了解每个功能的用途和操作步骤。然而,在某些情况下,提示信息可能过于复杂或冗长,使用户难以快速了解核心信息。
- 产品集成方面:(1)集成文档和教程:当前, ACK、Prometheus 和 ACK 云原生 AI 套件之间的集成文档可能不够完善,或者存在不一致的情况。某些用户可能难以快速了解如何进行集成,以及集成的最佳实践。因此,提供更为详细、清晰的集成文档和教程将有助于提升用户体验。(2)统一的接口管理:尽管 ACK、Prometheus 和 ACK 云原生 AI 套件之间的集成在技术上可能没有问题,但用户可能会发现,由于接口管理的不统一,导致集成过程中出现一些不必要的困扰。例如,接口版本不兼容、接口调用方式不统一等问题。因此,对接口进行统一管理,确保接口的一致性和易用性也是提升集成体验的关键。(3)自动化的集成测试:在开发过程中,由于 ACK、Prometheus 和 ACK 云原生 AI 套件之间的集成可能涉及到多个团队和项目,因此确保集成的正确性可能会成为一个挑战。自动化的集成测试可以大大减少集成过程中出现的错误和问题,提高集成的效率和准确性。(4)可视化的集成管理界面:对于大型项目或企业级应用,管理和监控 ACK、Prometheus 和 ACK 云原生 AI 套件之间的集成可能是一项重要的任务。提供可视化集成管理界面,使得用户可以方便地监控集成的状态、性能和错误信息,将极大地提升集成的可靠性和用户体验。(5)灵活的配置和扩展性:随着业务需求和技术发展的不断变化, ACK、Prometheus 和 ACK 云原生 AI 套件之间的集成可能需要不断地进行修改和扩展。因此,提供灵活的配置选项和扩展接口,使得用户可以根据自身需要进行定制和扩展,也是提升集成体验的重要方面。
在体验 ACK 云原生 AI 套件的过程中,我对其提供的功能和能力有了深入的了解。就我看来,ACK 云原生 AI 套件在许多方面都能满足实际生产业务场景的需求。
首先,从资源运维管理到模型推理服务,ACK 云原生 AI 套件提供了一套完整的解决方案,几乎覆盖了AI生产流程的所有环节。其强大的功能可以帮助企业级用户轻松应对复杂的业务需求,提高生产效率。
其次,ACK 云原生 AI 套件的控制台展示友好,操作流程流畅,提示信息完整,进一步提高了使用效率。这些特性使其在用户中获得了良好的口碑。
然而,尽管 ACK 云原生 AI 套件在很多方面表现出色,但我也注意到了一些仍需改进的地方。
- 尽管 ACK 云原生 AI 套件提供了大量的功能和工具,但对于某些特定的业务场景,可能需要额外的定制化支持。这可能涉及到更深入的二次开发或特定的业务解决方案,这是当前产品能力可能无法完全解决的。
- 在某些情况下,产品的文档可能不足以覆盖所有特性和功能的使用细节。这可能导致用户在某些情况下无法完全理解或正确使用某些功能,需要更深入的指导和帮助。
- 在全球化的背景下,尽管 ACK 云原生 AI 套件支持多种语言,但在某些特定领域,可能需要提供更深入的本地化支持。
- 在数据安全和合规性方面,尽管 ACK 云原生 AI 套件提供了一些基本的功能和工具,但在处理敏感数据或需要高度合规性的场景中,可能需要提供更强大的数据加密和安全控制功能。
- 在模型推理服务方面,尽管 ACK 云原生 AI 套件提供了实时和批量推理服务,但对于大规模、高并发的推理场景,可能需要提供更高效的并行处理和负载均衡功能。
综上所述,尽管 ACK 云原生 AI 套件已经具有强大的功能和优秀的用户体验,但仍有一些特定场景和需求需要进一步的产品改进和定制化支持。这可能涉及到更深入的二次开发、文档完善、本地化支持、数据安全增强以及模型推理服务的优化等方面。