介绍
ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础上,ChatGLM2-6B具有更强大的性能、更长的上下文、更高效的推理等特性。
资源编排服务(Resource Orchestration Service, ROS)是阿里云提供基于基础设施即代码(Infrastructure as Code, IaC) 理念的自动化部署服务,我们可以通过定义一个 Terraform 模板,轻松部署云上的 ChatGLM2-6B 模型。
⚠️说明:
阿里云不对第三方模型“ChatGLM2-6B”的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。
ChatGLM2-6B的代码依照Apache-2.0协议开源,ChatGLM2-6B模型权重的使用遵循Model License。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。
ChatGLM2-6B模型权重对学术研究完全开放,免费商用请需填写商业授权申请。本文所示的模型下载仅作为演示,阿里云不对由此引发的任何损害承担责任。
部署步骤
- 登录ROS控制台 ChatGLM2-6B 部署页面
- 配置模板参数:选择 ECS 实例的实例类型、可用区参数
⚠️说明:
部署地域最好选择新加坡,国内可能无法访问下载docker镜像。
- 点击【创建】进行资源部署。部署完成后,点击资源栈的输出,即可看到 ChatGLM2-6B 服务的地址。点击链接即可体验 ChatGLM2-6B 的功能。
部署原理
我们可以看到通过 ROS 可以非常快捷地部署阿里云上的各种云资源(比如 VPC、VSwitch、ECS 实例等)和应用程序(比如 ChatGLM2-6B)。如果想了解是如何做到的,那么可以阅读此章节。
- 编写 Terraform 模板。在如下模板中定义了:
- resource:定义了 vpc、vswitch、ecs 实例、安全组、安全组规则以及安装 ChatGLM2-6B 的命令执行。
- variable:定义了常用的参数,比如可用区、ECS实例类型类型。
- output:定义了自定义输出,比如 ChatGLM2-6B 服务的地址
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],"Architecture": "X86"}}}EOTdefault = "ecs.hfg8i.4xlarge"
}resource "alicloud_vpc" "vpc" {vpc_name = "chat-glm2-6b-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 = "Chat-GLM2-6B"vswitch_id = alicloud_vswitch.vswitch.idinternet_max_bandwidth_out = 100system_disk_size = 100
}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 intel/xfastertransformer:1.3.1
sudo docker run --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer intel/xfastertransformer:1.3.1 sh -c "tail -f /dev/null" &
sleep 5
sudo docker exec xFT sh -c '
apt update
apt install -y wget git git-lfs vim tmux
cd /root/xFasterTransformer
git lfs install
mkdir /mnt/data
cd /mnt/data
git clone --depth 1 https://www.modelscope.cn/ZhipuAI/chatglm2-6b.git /mnt/data/chatglm2-6b
python -c "import xfastertransformer as xft; xft.ChatGLM2Convert().convert(\"/mnt/data/chatglm2-6b\")"
mkdir -p ~/.config/pip
cat > ~/.config/pip/pip.conf <<EOX
[global]
index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/[install]
trusted-host=mirrors.cloud.aliyuncs.com
EOXcd /root/xFasterTransformer/examples/web_demo
pip install -r requirements.txt
cpu_count=$(lscpu | grep "^CPU(s):" | awk "{print \$NF}")
OMP_NUM_THREADS=$((cpu_count / 2))
export LD_PRELOAD=libiomp5.so
export GRADIO_SERVER_NAME="0.0.0.0"
cpu_list=$(seq -s, 0 2 $((cpu_count - 2)))
nohup numactl -C $cpu_list -m 0 python ChatGLM2.py -t /mnt/data/chatglm2-6b -m /mnt/data/chatglm2-6b-xft -d bf16 > output.log 2>&1 &
sleep 5
'
EOFbase_64_command = base64encode(local.command)
}resource "alicloud_ecs_command" "command" {name = "chat-glm2-6b-command"command_content = local.base_64_commandtype = "RunShellScript"timeout = 3600working_dir = "/root"
}resource "alicloud_ecs_invocation" "default" {command_id = alicloud_ecs_command.command.idinstance_id = [alicloud_instance.ecs.id]timeouts {create = "3600s"}
}output "Url" {description = <<EOT{"Label": "Web 访问地址","Description": "ChatGLM2-6B Chat页面访问地址."}EOTvalue = format("http://%s:7860", alicloud_instance.ecs.public_ip)
}
- 在 ROS 控制台中使用此模板创建资源栈。ROS 会自动解析出模板中资源的依赖关系,按照资源依赖顺序创建云资源。如果资源间没有依赖,则会并发创建,从而提升部署效率。ROS 会把这次创建的所有资源存放到一个“资源栈”中,后续可以方便地管理这组资源集合。比如:
- 将新模板应用到这个“资源栈”中,从而更新里面的资源。
- 删除这个“资源栈”,从而把所有的资源删掉。
总结
基于 IaC 的理念,通过定义一个模板,使用 ROS 进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 ChatGLM2-6B 模型)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。