介绍
Qwen-Audio是阿里云研发的大规模音频语言模型(Large Audio Language Model)。Qwen-Audio可以以多种音频(包括说话人语音、自然音、音乐、歌声)和文本作为输入,并以文本作为输出。在Qwen-Audio的基础上,利用对齐机制打造出基于大语言模型的语音AI助手Qwen-Audio-Chat,它支持更灵活的交互方式,包括多音频、多轮问答、创作等能力。支持多种语音场景,包括声音理解和推理、音乐欣赏、多音频分析、多轮音频-文本交错对话以及外部语音工具的使用等。
资源编排服务(Resource Orchestration Service, ROS)是阿里云提供基于基础设施即代码(Infrastructure as Code, IaC) 理念的自动化部署服务,我们可以通过定义一个 Terraform 模板,轻松部署云上的 Qwen-Audio-Chat 模型。
⚠️说明:
Qwen-Audio-Chat模型依照LICENSE开源,免费商用需填写商业授权申请。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。
部署步骤
- 登录ROS控制台 Qwen-Audio-Chat 部署页面
- 配置模板参数:选择 ECS 实例的实例类型、可用区参数
- 点击【下一步】,然后点击【创建】进行资源部署。部署完成后,点击资源栈的输出,即可看到 Qwen-Audio-Chat 服务的地址。点击链接即可体验 Qwen-Audio-Chat 的功能。
4.单击Upload(上传文件)上传语音文件,然后在Input对话框中,输入对话内容,单击Submit(发送),即可开始语音问答、创作等。
部署原理
我们可以看到通过 ROS 可以非常快捷地部署阿里云上的各种云资源(比如 VPC、VSwitch、ECS 实例等)和应用程序(比如 Qwen-Audio-Chat)。如果想了解是如何做到的,那么可以阅读此章节。
- 编写 Terraform 模板。在如下模板中定义了:
- resource:定义了 vpc、vswitch、ecs、安全组、安全组规则以及安装 Qwen-Audio-Chat 的命令执行。
- variable:定义了常用的参数,比如可用区、ECS实例类型类型。
- output:定义了自定义输出,比如 Qwen-Audio-Chat 服务的地址
variable "zone_id" {
type = string
description = <<EOT
{
"AssociationProperty": "ZoneId",
"Label": {
"zh-cn": "可用区ID",
"en": "Zone ID"
}
}
EOT
}
variable "instance_type" {
type = string
description = <<EOT
{
"Label": {
"zh-cn": "实例类型",
"en": "Instance Type"
},
"AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
"AssociationPropertyMetadata": {
"Constraints": {
"Memory": [
64
]
}
}
}
EOT
default = "ecs.g8a.4xlarge"
}
resource "alicloud_vpc" "vpc" {
vpc_name = "qwen-audio-vpc"
cidr_block = "192.168.0.0/16"
}
resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
zone_id = var.zone_id
cidr_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 = 1
security_group_id = alicloud_security_group.group.id
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_instance" "ecs" {
availability_zone = var.zone_id
security_groups = alicloud_security_group.group.*.id
instance_type = var.instance_type
system_disk_category = "cloud_essd"
image_id = "aliyun_3_x64_20G_alibase_20240528.vhd"
instance_name = "qwen-audio"
vswitch_id = alicloud_vswitch.vswitch.id
internet_max_bandwidth_out = 10
system_disk_size = 100
password = "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/celp/deploy_qwen-audio-chat_amd-docker.sh
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-6.1-amd64-static.tar.xz
sed -i 's/hwloc / /' deploy_qwen-audio-chat_amd-docker.sh
sed -i 's/"python-einops"/python-einops --skip-broken/' deploy_qwen-audio-chat_amd-docker.sh
sed -i 's/@ 2>\&1/@ > output.log 2>\&1/' deploy_qwen-audio-chat_amd-docker.sh
sudo docker exec -w /root pytorch-amd sh -c '
chmod +x ./deploy_qwen-audio-chat_amd-docker.sh
./deploy_qwen-audio-chat_amd-docker.sh
'
EOF
base_64_command = base64encode(local.command)
}
resource "alicloud_ecs_command" "command" {
name = "qwen-audio-command"
command_content = local.base_64_command
type = "RunShellScript"
timeout = 7200
working_dir = "/root"
}
resource "alicloud_ecs_invocation" "default" {
command_id = alicloud_ecs_command.command.id
instance_id = [alicloud_instance.ecs.id]
timeouts {
create = "7200s"
}
}
output "Url" {
description = <<EOT
{
"Label": "Web 访问地址",
"Description": "Qwen Audio Chat页面访问地址."
}
EOT
value = format("http://%s:7860", alicloud_instance.ecs.public_ip)
}
- 在 ROS 控制台中使用此模板创建资源栈。ROS 会自动解析出模板中资源的依赖关系,按照资源依赖顺序创建云资源。如果资源间没有依赖,则会并发创建,从而提升部署效率。ROS 会把这次创建的所有资源存放到一个“资源栈”中,后续可以方便地管理这组资源集合。比如:
- 将新模板应用到这个“资源栈”中,从而更新里面的资源。
- 删除这个“资源栈”,从而把所有的资源删掉。
总结
基于 IaC 的理念,通过定义一个模板,使用 ROS 进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 Qwen-Audio-Chat 服务)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。