文章目录
- 1. 背景
- 2.环境介绍
- 2.1 硬件环境
- 2.2 软件环境
- 3. 大模型环境部署
- 3.1 准备硬件资源
- 3.2 大模型部署
- 3.1 部署Docker
- 3.2 部署Intel xFasterTransformer容器
- 3.3 准备模型数据
- 3.4 运行模型进行AI对话
- 4. 构建主动问询导购助手应用
1. 背景
北京又开始发放消费券啦!这次的活动是 2024 北京家电以旧换新补贴,一直持续到年底,面向消费者开始发放家电 8 折消费券,可用于线上和线下渠道。为了帮助大家更好的选择自己喜欢的家电产品。我们团队使用通义千问大模型&Intel G8i开发主动问询导购助手帮助大家作为AI智能向导购买更合适的商品
在当下网络购物环境中,当用户登录购物网站开始选购商品时,往往是用户主动去询问客服,以了解商品的各种特性与详情。但现在,我们开发了基于百川大模型深度的智能导购助手。它会主动向用户发出询问,耐心且细致地收集用户所需的商品参数信息。待收集任务完成后,会以清晰的格式将参数信息打印出来,方便用户查看。当这个智能导购助手成功收集到顾客对于商品参数的具体偏好后,便能够从规模庞大、种类繁多的商品数据库中迅速筛选出符合用户需求的商品并返回给用户。通过这样的方式,它可以更好地帮助用户在海量的商品海洋中精准地找到最适合自己的商品,进而显著提高商品的转化率,为用户带来更为便捷、高效、满意的购物体验。
2.环境介绍
本次部署应用使用到的软硬件资源如下
2.1 硬件环境
硬件配置:
- 阿里云平台的英特尔至强可扩展处理器的G8i云环境
g8i 实例采用 CIPU+飞天技术架构,搭载第四代英特尔® 至强® 可扩展处理器,网络性能及存储 I/O 均实现大幅演进。尤其可圈可点的是,g8i 还标配阿里云自研 eRDMA 大规模加速能力,标志着 eRDMA 能力的全面商业化。阿里云 CIPU 所独有的 eRDMA 可让网络时延低至 8 微秒2**,且可依托** RDMA 协议栈的高性能、低开销特性,将 CPU 负载更多释放出来,使其更专注于业务处理。
这些独具的优势,在第四代英特尔® 至强® 可扩展处理器具备的 DDR5、CXL1.1、PCIe 5.0 等全新特性及内置加速器的支持下,使得 g8i 更加如虎添翼,全核睿频 p0n 达到 3.2GHz,性能相比上一代实例最大提升 60%,在计算、网络、存储、安全等方面均有炸裂般表现。
2.2 软件环境
- 大模型选取Qwen-72B-Chat大模型
通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。而Qwen-72B-Chat是在Qwen-72B的基础上,使用对齐机制打造的基于大语言模型的AI助手,是通义千问对外开源的72B规模参数量的经过人类指令对齐的Chat模型。
- BigDL-LLM.
BigDL-LLM是一个专为大型语言模型优化设计的加速库,它提供了多种低精度优化选项(例如 INT4、INT5、INT8等),并可利用Intel® CPU集成的多种硬件加速技术(例如AVX、VNNI、AMX等)以及最新的软件优化,从而赋能大语言模型在Intel® 平台上实现更高效的优化和更快速的运行。
-
操作系统
Alibaba Cloud Linux 3.2104 LTS 64位
3. 大模型环境部署
3.1 准备硬件资源
登录阿里云ECS控制台
https://ecs-buy.aliyun.com/ecs#/custom/prepay/cn-shanghai
准备购买阿里云云主机
这里我们选择实例规格为ecs.g8i.8xlarge
操作系统选择Alibaba Cloud Linux 3.2104 LTS 64位
Qwen-72B-Chat的运行需要下载多个模型文件,会占用大量存储空间,为了保证模型顺利运行,数据盘设置为300 GiB。
配置完成后,进行下单
3.2 大模型部署
远程登录购买的G8i主机
3.1 部署Docker
参考网页https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance?spm=a2c4g.11186623.0.0.12647f93tez0na
-
登录ECS管理控制台,找到目标ECS实例,单击实例ID,进入实例详情页。
-
选择****定时与自动化任务** > *安装/卸载扩展程序* > *安装扩展程序***。
-
在安装扩展程序对话框,要安装的扩展程序选择Docker社区版,然后单击下一步,按照界面提示完成操作。
当任务状态为已完成时,说明Docker已安装。
从docker hub
中下载bigdl-llm-serving-cpu
镜像。
bigdl-llm-serving-cpu镜像中已包含运行通义千问所需的环境,启动容器后可直接使用。
3.2 部署Intel xFasterTransformer容器
获取并运行Intel xFasterTransformer容器。
xFasterTransformer是由Intel官方开源的推理框架,为大语言模型(LLM)在CPU X86平台上的部署提供了一种深度优化的解决方案,支持多CPU节点之间的分布式部署方案,使得超大模型在CPU上的部署成为可能。此外,xFasterTransformer提供了C++和Python两种API接口,涵盖了从上层到底层的接口调用,易于用户使用并将xFasterTransformer集成到自有业务框架中。
sudo docker pull registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
sudo docker run -it --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
更新xFasterTransformer脚本代码。
xFasterTransformer镜像中已包含对应版本的脚本代码,可以更新升级到最新的测试脚本。
yum update -y
yum install -y git
cd /root/xFasterTransformer
git pull
3.3 准备模型数据
-
在容器中安装依赖软件。
yum update -y yum install -y wget git git-lfs vim tmux
-
启用Git LFS。
下载预训练模型需要Git LFS的支持。
git lfs install
-
创建并进入模型数据目录。
mkdir /mnt/data cd /mnt/data
-
创建一个tmux session。
tmux
下载Qwen-7B-Chat预训练模型。
git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git /mnt/data/qwen-7b-chat
转换模型数据。
由于下载的模型数据是HuggingFace格式,需要转换成xFasterTransformer格式。生成的模型文件夹为/mnt/data/qwen-7b-chat-xft
。
python -c 'import xfastertransformer as xft; xft.QwenConvert().convert("/mnt/data/qwen-7b-chat")'
3.4 运行模型进行AI对话
cd /root/xFasterTransformer/examples/pytorch
OMP_NUM_THREADS=$(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') / 2)) LD_PRELOAD=libiomp5.so numactl -C $(seq -s, 0 2 $(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') - 2))) -m 0 python demo.py -t /mnt/data/qwen-7b-chat -m /mnt/data/qwen-7b-chat-xft -d bf16 --chat true
在容器中,依次执行以下命令,安装WebUI相关依赖软件。
cd /root/xFasterTransformer/examples/web_demo
pip install -r requirements.txt
执行以下命令,启动WebUI。使用作为API进行调用
OMP_NUM_THREADS=$(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') / 2)) GRADIO_SERVER_NAME="0.0.0.0" numactl -C $(seq -s, 0 2 $(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') - 2))) -m 0 python Qwen.py -t /mnt/data/qwen-7b-chat -m /mnt/data/qwen-7b-chat-xft -d bf16
4. 构建主动问询导购助手应用
使用vscode调用大模型
大模型API使用
使用nginx反向代理来解决跨域问题
后端python代码,使用python的flask框架来启动服务
from flask import Flask, request, Response, send_from_directory
from agents import chat, init_thread
app = Flask(__name__, static_folder="static")
@app.route("/")
def index():
return send_from_directory(app.static_folder, 'index.html')
@app.route("/chat", methods=["POST"])
def main():
data = request.get_json()
input_prompt = data.get("prompt", "你好")
thread_id = data.get("sessionId", "")
if thread_id is None:
response = init_thread()
print(response)
thread_id = response['thread_id']
response = Response(
chat(input_prompt=input_prompt, thread_id=thread_id),
mimetype='text/event-stream'
)
return response
# 运行 web 程序
app.run(host="0.0.0.0", port=9000)
执行结果如下