系列篇章💥
目录
引言
在当今的自然语言处理领域,先进的模型不断涌现,为我们带来更出色的语言交互体验。Qwen-Audio-Chat 模型便是其中的佼佼者,本文将详细介绍如何通过 FastApi 对其进行部署,助您在实际应用中充分发挥其强大功能。
一、Qwen-Audio 介绍
Qwen-Audio 是阿里云研发的大规模音频语言模型(Large Audio Language Model)。Qwen-Audio 可以以多种音频 (包括说话人语音、自然音、音乐、歌声)和文本作为输入,并以文本作为输出。Qwen-Audio 系列模型的特点包括:
- 音频基石模型:Qwen-Audio是一个性能卓越的通用的音频理解模型,支持各种任务、语言和音频类型。在Qwen-Audio的基础上,我们通过指令微调开发了Qwen-Audio-Chat,支持多轮、多语言、多语言对话。Qwen-Audio和Qwen-Audio-Chat模型均已开源。
- 兼容多种复杂音频的多任务学习框架:为了避免由于数据收集来源不同以及任务类型不同,带来的音频到文本的一对多的干扰问题,我们提出了一种多任务训练框架,实现相似任务的知识共享,并尽可能减少不同任务之间的干扰。通过提出的框架,Qwen-Audio可以容纳训练超过30多种不同的音频任务;
- 出色的性能:Qwen-Audio在不需要任何任务特定的微调的情况下,在各种基准任务上取得了领先的结果。具体得,Qwen-Audio在Aishell1、cochlscene、ClothoAQA和VocalSound的测试集上都达到了SOTA;
- 支持多轮音频和文本对话,支持各种语音场景:Qwen-Audio-Chat支持声音理解和推理、音乐欣赏、多音频分析、多轮音频-文本交错对话以及外部语音工具的使用(如语音编辑)。
二、环境准备
官方建议配置如下:
- Python 3.8 及以上版本
- Pytorch 1.12 及以上版本,建议 2.0 及以上版本
- 对于 GPU 用户,建议使用 CUDA 11.4 及以上版本
为了方便操作,您可以在 autodl 平台中租用一个拥有 24G 显存(如 3090 显卡)的机器。在镜像选择方面,选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8(11.3 版本以上的均可)。接下来,打开刚刚租用服务器的 JupyterLab 图像,并在其中的终端开始进行环境配置、模型下载和运行演示。
三、安装依赖
1、pip安装依赖包
在终端中依次执行以下命令,完成相关依赖的安装:
# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope==1.9.5
pip install accelerate
pip install tiktoken
pip install einops
pip install transformers_stream_generator==0.0.4
pip install scipy
pip install torchvision
pip install pillow
pip install tensorboard
pip install matplotlib
pip install transformers==4.32.0
pip install gradio==3.39.0
pip install nest_asyncio
执行如下:
2、安装ffmpeg
打开终端,输入以下命令安装ffmpeg:
sudo apt update
sudo apt install ffmpeg
安装完成后,检查ffmpeg是否已经添加到环境变量中。在终端中输入以下命令:
ffmpeg -version
如果显示ffmpeg的版本信息,说明已经成功添加到环境变量中。如果没有显示,则需要将其添加到环境变量中
四、模型下载
使用 modelscope 中的 snapshot_download 函数下载模型。第一个参数为模型名称,参数 cache_dir 用于指定模型的下载路径。
在 /root/autodl-tmp 路径下新建 d.py 文件,并在其中输入以下内容:
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
from modelscope import GenerationConfig
model_dir = snapshot_download('qwen/Qwen-Audio-Chat', cache_dir='/root/autodl-tmp', revision='master')
运行 python /root/autodl-tmp/d.py 执行下载。需注意,模型大小约为 20 GB,下载模型大概需要 10 - 20 分钟,请耐心等待。
五、代码准备
在 /root/autodl-tmp 路径下新建 api-test.py 文件,并在其中输入以下内容:
from fastapi import FastAPI, Request, File, UploadFile, Query
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import uvicorn
import json
import datetime
import torch
import os
import nest_asyncio
nest_asyncio.apply()
# 设置设备参数
DEVICE = "cuda" # 使用CUDA
DEVICE_ID = "0" # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE # 组合CUDA设备信息
# 清理GPU内存函数
def torch_gc():
if torch.cuda.is_available(): # 检查是否可用CUDA
with torch.cuda.device(CUDA_DEVICE): # 指定CUDA设备
torch.cuda.empty_cache() # 清空CUDA缓存
torch.cuda.ipc_collect() # 收集CUDA内存碎片
# 创建FastAPI应用
app = FastAPI()
# 处理POST请求的端点
@app.post("/audio/")
async def create_audio_item(file: UploadFile = File(...)):
global model, tokenizer # 使用全局变量
# 保存音频文件到临时路径
temp_file_path = f"temp/{file.filename}"
with open(temp_file_path, 'wb') as f:
f.write(file.file.read())
file.file.close()
# 1st dialogue turn
query = tokenizer.from_list_format([
{'audio': temp_file_path}, # 使用保存的临时音频文件路径
{'text': 'what does the person say?'},
])
response, history = model.chat(tokenizer, query=query, history=None)
# 清理临时文件
os.remove(temp_file_path)
now = datetime.datetime.now() # 获取当前时间
time = now.strftime("%Y-%m-%d %H:%M:%S") # 格式化时间为字符串
# 构建响应JSON
answer = {
"response": response,
"status": 200,
"time": time
}
print(f"[{time}] Response: {response}") # 打印日志
torch_gc() # 执行GPU内存清理
return answer
@app.get("/test-audio/")
def test_audio(audio_file_path: str = Query('/root/autodl-tmp/1272-128104-0000.flac', alias='audio'),
text_query: str = Query('what does the person say?', alias='text')):
"""
测试音频接口,用户可以指定音频文件路径和文本查询
:param audio_file_path: 音频文件的路径
:param text_query: 文本查询内容
"""
# 使用model和tokenizer处理音频和文本
query = tokenizer.from_list_format([
{'audio': audio_file_path},
{'text': text_query},
])
response, history = model.chat(tokenizer, query=query, history=None)
return {"response": response}
# 主函数入口
if __name__ == '__main__':
mode_name_or_path = '/root/autodl-tmp/qwen/Qwen-Audio-Chat'
# 加载预训练的分词器和模型
tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_code=True,torch_dtype=torch.bfloat16, device_map="auto")
model.generation_config = GenerationConfig.from_pretrained(mode_name_or_path)
model.generation_config.pad_token_id = model.generation_config.eos_token_id
model.eval() # 设置模型为评估模式
# 启动FastAPI应用
# 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
uvicorn.run(app, host='0.0.0.0', port=6006, workers=1) # 在指定端口和主机上启动应用
六、Api 部署调用
1、测试音频准备
执行以下命令获取测试音频文件:
wget -O /root/autodl-tmp/1272-128104-0000.flac https://github.com/QwenLM/Qwen-Audio/raw/main/assets/audio/1272-128104-0000.flac
2、启动API服务
在终端输入以下命令启动api服务
cd /root/autodl-tmp
python api-test.py
加载完毕后出现如下信息说明成功。
3、Curl命令调用API
默认部署在 6006 端口,通过 POST 方法进行调用,可以使用curl调用,如下所示:
curl http://127.0.0.1:6006/test-audio/
输出:( api-test.py代码中可以看到test-audio会默认调用模型解析音频文件/root/autodl-tmp/1272-128104-0000.flac
)
语音识别成功
从输出结果中可以看到,返回了音频中的人说的内容:mister quilter is the apostle of the middle classes and we are glad to welcome his gospel
4、Python代码调用API
也可以使用python中的requests库进行调用,如下所示:
import requests
def get_audio_response(audio_file_path, text_query):
# 设置API的URL
url = 'http://127.0.0.1:6006/test-audio/'
# 设置音频文件路径和文本查询的参数
params = {
'audio': audio_file_path, # 音频文件路径
'text': text_query # 文本查询
}
# 发送GET请求
response = requests.get(url, params=params)
# 提取所需信息
result = {
"response": response.json(),
"status_code": response.status_code,
"time": response.headers.get('Date') # 获取响应头中的时间信息
}
return result
if __name__ == '__main__':
# 测试请求
audio_file = '/root/autodl-tmp/1272-128104-0000.flac'
text_query = '这是男生还是女生说的?'
completion = get_audio_response(audio_file, text_query)
print(completion)
得到的返回值如下所示:
{'response': {'response': '根据音色判断,这是男性说的。'}, 'status_code': 200, 'time': 'Sun, 28 Jul 2024 13:30:44 GMT'}
结语
通过以上详细的步骤,您已经成功地完成了 Qwen-Audio-Chat 模型的 FastApi 部署,并能够通过多种方式进行调用和测试。希望这一部署过程能为您的项目和应用带来新的可能性和价值。在实际应用中,您可以根据具体需求进一步优化和扩展功能,充分发挥 Qwen-Audio-Chat 模型的强大能力,为用户提供更智能、便捷的音频交互服务。
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!