当前位置: 首页 > news >正文

基于 ROS 的Terraform托管服务轻松部署Qwen-VL-Chat

介绍

Qwen-VL是阿里云研发的大规模视觉语言模型(Large Vision Language Model)。Qwen-VL可以以图像、文本、检测框作为输入,并以文本和检测框作为输出。在Qwen-VL的基础上,利用对齐机制打造出基于大语言模型的视觉AI助手Qwen-VL-Chat,它支持更灵活的交互方式,包括多图、多轮问答、创作等能力,天然支持英文、中文等多语言对话,支持多图输入和比较,指定图片问答,多图文学创作等。

资源编排服务(Resource Orchestration Service, ROS)是阿里云提供基于基础设施即代码(Infrastructure as Code, IaC) 理念的自动化部署服务,我们可以通过定义一个 Terraform 模板,轻松部署云上的 Qwen-VL 模型。

⚠️说明:
Qwen-VL-Chat模型依照LICENSE开源,免费商用需填写商业授权申请。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

部署步骤

  1. 登录ROS控制台 Qwen-VL 部署页面

  2. 配置模板参数:选择 ECS 实例的实例类型、可用区参数

  3. 点击【下一步】,然后点击【创建】进行资源部署。部署完成后,点击资源栈的输出,即可看到 Qwen-VL-Chat 服务的地址。点击链接即可体验 Qwen-VL-Chat 的功能。

  4. 单击Upload(上传文件)上传图片,然后在Input对话框中,输入对话内容,单击Submit(发送),即可开始图片问答、图片检测框标注等。

部署原理

我们可以看到通过 ROS 可以非常快捷地部署阿里云上的各种云资源(比如 VPC、VSwitch、ECS 实例等)和应用程序(比如 Qwen-VL-Chat)。如果想了解是如何做到的,那么可以阅读此章节。

  1. 编写 Terraform 模板。在如下模板中定义了:
  • resource:定义了 vpc、vswitch、ecs、安全组、安全组规则以及安装 Qwen-VL-Chat 的命令执行。
  • variable:定义了常用的参数,比如可用区、ECS实例类型类型。
  • output:定义了自定义输出,比如 Qwen-VL-Chat 服务的地址
variable "zone_id" {type        = stringdescription = <<EOT{"AssociationProperty": "ZoneId","Label": {"zh-cn": "可用区ID","en": "Zone ID"}}EOT
}variable "instance_type" {type        = stringdescription = <<EOT{"Label": {"zh-cn": "实例类型","en": "Instance Type"},"AssociationProperty": "ALIYUN::ECS::Instance::InstanceType","AssociationPropertyMetadata": {"Constraints": {"Memory": [64]}}}EOTdefault     = "ecs.g8a.4xlarge"
}resource "alicloud_vpc" "vpc" {vpc_name   = "qwen-vl-vpc"cidr_block = "192.168.0.0/16"
}resource "alicloud_vswitch" "vswitch" {vpc_id     = alicloud_vpc.vpc.idzone_id    = var.zone_idcidr_block = "192.168.0.0/24"
}resource "alicloud_security_group" "group" {vpc_id = alicloud_vpc.vpc.id
}resource "alicloud_security_group_rule" "rule" {type              = "ingress"ip_protocol       = "tcp"nic_type          = "intranet"policy            = "accept"port_range        = "7860/7860"priority          = 1security_group_id = alicloud_security_group.group.idcidr_ip           = "0.0.0.0/0"
}resource "alicloud_instance" "ecs" {availability_zone          = var.zone_idsecurity_groups            = alicloud_security_group.group.*.idinstance_type              = var.instance_typesystem_disk_category       = "cloud_essd"image_id                   = "aliyun_3_x64_20G_alibase_20240528.vhd"instance_name              = "qwen-vl"vswitch_id                 = alicloud_vswitch.vswitch.idinternet_max_bandwidth_out = 10system_disk_size = 100password = "Ros12345"
}locals {command         = <<EOF
#!/bin/bash
sudo dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus
sudo dnf -y install docker-ce --nobest
sudo systemctl start docker
sudo systemctl enable docker
sudo docker pull registry.openanolis.cn/openanolis/pytorch-amd:1.13.1-23-zendnn4.1
sudo docker run -d --name pytorch-amd --net host -v $HOME:/root registry.openanolis.cn/openanolis/pytorch-amd:1.13.1-23-zendnn4.1 sh -c "tail -f /dev/null" &
wget https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20231213/owpj/deploy_qwen-vl-chat_amd-docker.sh
sed -i 's/hwloc / /' deploy_qwen-vl-chat_amd-docker.sh
sed -i 's/"python-einops"/python-einops --skip-broken/' deploy_qwen-vl-chat_amd-docker.sh
sed -i 's/@ 2>\&1/@ > output.log 2>\&1/' deploy_qwen-vl-chat_amd-docker.sh
sudo docker exec -w /root pytorch-amd sh -c '
chmod +x deploy_qwen-vl-chat_amd-docker.sh
./deploy_qwen-vl-chat_amd-docker.sh
pip install -r Qwen-VL/requirements.txt
pip install -r Qwen-VL/requirements_web_demo.txt
pip install -r Qwen-VL/requirements_openai_api.txt
./deploy_qwen-vl-chat_amd-docker.sh
'
EOFbase_64_command = base64encode(local.command)
}resource "alicloud_ecs_command" "command" {name            = "qwen-vl-command"command_content = local.base_64_commandtype            = "RunShellScript"timeout         = 7200working_dir     = "/root"
}resource "alicloud_ecs_invocation" "default" {command_id  = alicloud_ecs_command.command.idinstance_id = [alicloud_instance.ecs.id]timeouts {create = "7200s"}
}output "Url" {description = <<EOT{"Label": "Web 访问地址","Description": "Qwen VL Chat页面访问地址."}EOTvalue = format("http://%s:7860", alicloud_instance.ecs.public_ip)
}
  1. 在 ROS 控制台中使用此模板创建资源栈。ROS 会自动解析出模板中资源的依赖关系,按照资源依赖顺序创建云资源。如果资源间没有依赖,则会并发创建,从而提升部署效率。ROS 会把这次创建的所有资源存放到一个“资源栈”中,后续可以方便地管理这组资源集合。比如:
  • 将新模板应用到这个“资源栈”中,从而更新里面的资源。
  • 删除这个“资源栈”,从而把所有的资源删掉。

总结

基于 IaC 的理念,通过定义一个模板,使用 ROS 进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 Qwen-VL 模型)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新书宣传:《量子安全:信息保护新纪元》
  • JavaScript高级——关于语句分号的问题
  • redis为什么这么快
  • 组织应在其网络安全策略中考虑MLSecOps吗?
  • MM-PhyQA——一个专门处理高中物理选择题的 LLM 聊天机器人
  • 【网络安全】-文件上传漏洞实战-upload-labs(0~16)
  • 如何用GPU算力卡P100玩黑神话悟空?
  • Python 数学建模——独立性检验
  • spring如何整合druid连接池?
  • 大模型LLM部署学习
  • [数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
  • 网络安全工程师能赚多少钱一个月?
  • 构建常态化安全防线:XDR的态势感知与自动化响应机制
  • html css网页制作
  • 【failed with MalformedInputException: Input length = 1 -> 修复解决方案】
  • “大数据应用场景”之隔壁老王(连载四)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 5、React组件事件详解
  • CSS中外联样式表代表的含义
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之索引简介
  • 从零开始学习部署
  • 从重复到重用
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 听说你叫Java(二)–Servlet请求
  • 移动端唤起键盘时取消position:fixed定位
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (11)MSP430F5529 定时器B
  • (C语言)共用体union的用法举例
  • (HAL库版)freeRTOS移植STMF103
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (编译到47%失败)to be deleted
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (一) springboot详细介绍
  • (转)大型网站架构演变和知识体系
  • (转)关于多人操作数据的处理策略
  • (转)可以带来幸福的一本书
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .net反混淆脱壳工具de4dot的使用
  • @NestedConfigurationProperty 注解用法
  • @RequestMapping 的作用是什么?
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • []Telit UC864E 拨号上网
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [Android]How to use FFmpeg to decode Android f...