十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Qwen-Audio-Chat FastAPI 部署调用全流程指南(self-llm 开源大模型食用指南)

Qwen-Audio-Chat FastAPI 部署调用全流程指南(self-llm 开源大模型食用指南) Qwen-Audio-Chat FastAPI 部署调用全流程指南self-llm 开源大模型食用指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llmQwen-Audio-Chat 是阿里云推出的大规模音频语言模型Large Audio Language Model支持以说话人语音、自然音、音乐、歌声等多种音频与文本作为输入并以文本作为输出。本篇指南基于《开源大模型食用指南》self-llm仓库中的 Qwen-Audio FastApi 部署教程完整复现「租机选镜像 → 装依赖 → 下载模型 → 编写 FastAPI 服务 → 调用接口」的端到端流程读者完成后即可在本地/云端把一个 Qwen-Audio-Chat 模型封装为可对外提供服务的 HTTP API供业务系统或下游应用调用。Qwen-Audio 是什么Qwen-Audio是阿里云研发的大规模音频语言模型属于多模态大模型MLLM的一种。与纯文本 LLM 不同Qwen-Audio 能够直接听懂音频内容输入多种音频说话人语音、自然音、音乐、歌声以及文本输出文本。其对应的对话版本Qwen-Audio-Chat在基座模型之上经过对话指令微调能够理解音频内容并结合文本指令完成问答例如根据音色判断说话人性别、转写语音内容、理解歌词、描述自然音等。教程所在的 models/Qwen-Audio 目录下共提供两篇配套文档本文聚焦其中的 FastAPI 部署方案01-Qwen-Audio-chat FastApi.md将模型封装为 FastAPI HTTP 服务本文主体02-Qwen-Audio-chat WebDemo.md基于 Gradio 构建交互式 Web 界面相关补充。两者共享同一套环境准备与模型下载流程可根据使用场景二选一或同时部署。环境准备AutoDL 租机与镜像选择教程以 AutoDL 云平台为例推荐租用3090 等 24G 显存的显卡机器足以加载 Qwen-Audio-Chat约 20GB 权重并进行推理。租用机器时镜像选择如下组合CUDA 11.3 以上版本均可教程以 11.8 为例PyTorch → 2.0.0 → 3.8 (ubuntu20.04) → 11.8租用完成后打开服务器的JupyterLab在其中的终端里依次完成环境配置、模型下载和运行演示。依赖安装pip 换源与依赖清单由于国内网络环境教程首先对 pip 进行换源加速然后安装模型推理所需的全部依赖包# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope1.9.5 pip install accelerate pip install tiktoken pip install einops pip install transformers_stream_generator0.0.4 pip install scipy pip install torchvision pip install pillow pip install tensorboard pip install matplotlib pip install transformers4.32.0 pip install gradio3.39.0 pip install nest_asyncio各依赖在本次部署中的角色如下表所示依赖包作用modelscope1.9.5从 ModelScope魔搭下载模型权重提供snapshot_download、AutoModel等接口transformers4.32.0加载模型与分词器AutoModelForCausalLM/AutoTokenizer注意与 Qwen-Audio 的 remote code 版本匹配accelerate支持device_mapauto自动分配设备多卡/单卡tiktoken/einops分词与张量维度变换Qwen 系列模型运行所必需transformers_stream_generator流式生成支持组件固定 0.0.4 版本scipy/torchvision/pillow科学计算与多模态图像处理基础库gradio3.39.0仅 WebDemo 方案需要FastAPI 方案可省略nest_asyncio修复 Jupyter/部分环境下 FastAPI 的事件循环冲突tensorboard/matplotlib训练可视化与绘图工具便于后续微调扩展需要说明本仓库各模型教程在 AutoDL 等平台实践验证时transformers4.32.0与 Qwen-Audio 的trust_remote_code代码相兼容若使用更新的 transformers 版本请以 Qwen 官方兼容性说明为准。模型下载ModelScope snapshot_download在/root/autodl-tmp路径下新建download.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, revisionmaster)snapshot_download的第一个参数为模型名称qwen/Qwen-Audio-Chatcache_dir指定模型下载路径revisionmaster指定分支。保存后执行python /root/autodl-tmp/download.py模型大小约20 GB下载耗时约 1020 分钟。下载完成后模型权重位于/root/autodl-tmp/qwen/Qwen-Audio-Chat这也是后续 api.py 中模型加载路径的来源。为验证接口效果还需下载一份测试音频示例为英文语音文件名1272-128104-0000.flac保存到/root/autodl-tmp下wget -O /root/autodl-tmp/1272-128104-0000.flac https://github.com/QwenLM/Qwen-Audio/raw/main/assets/audio/1272-128104-0000.flac编写 FastAPI 服务api.py 核心代码解析在/root/autodl-tmp下新建api.py完整代码如下源自 01-Qwen-Audio-chat FastApi.md 的代码段落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 ftemp/{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, queryquery, historyNone) # 清理临时文件 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, aliasaudio), text_query: str Query(what does the person say?, aliastext)): 测试音频接口用户可以指定音频文件路径和文本查询 :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, queryquery, historyNone) 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_codeTrue) model AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_codeTrue,torch_dtypetorch.bfloat16, device_mapauto) 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, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用下面逐段拆解其关键设计帮助读者理解每一处配置的作用1. 全局设备配置与torch_gc显存回收DEVICE cuda DEVICE_ID 0 CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICECUDA_DEVICE最终形如cuda:0在多卡机器上可通过修改DEVICE_ID指定推理卡。torch_gc()在每次请求结束后显式调用torch.cuda.empty_cache()释放未使用的显存缓存与torch.cuda.ipc_collect()回收进程间通信碎片避免长时服务运行导致显存持续膨胀——这是长驻 API 服务中非常实用的工程实践。2.POST /audio/端点文件上传推理/audio/接受UploadFile类型的音频文件流程为将上传的音频流写入temp/临时目录注意需保证temp目录存在否则首次写入会报错用tokenizer.from_list_format把音频路径与文本指令组装成 Qwen 多模态对话格式[{audio: 路径}, {text: 指令}]调用model.chat(tokenizer, queryquery, historyNone)得到模型回复与对话历史删除临时文件、记录时间戳、调用torch_gc()回收显存最后返回{response, status, time}JSON。其中historyNone表示单轮问答若需多轮对话可在后续请求中回传上一轮返回的history。代码中导入的Request、json在本次示例中未实际使用属于可保留的预留导入。3.GET /test-audio/端点指定路径快速测试def test_audio(audio_file_path: str Query(/root/autodl-tmp/1272-128104-0000.flac, aliasaudio), text_query: str Query(what does the person say?, aliastext)):该端点为调试而生通过 Query 参数直接传服务器上已有的音频文件路径与文本指令免去上传步骤。alias将参数名映射为audio与text与from_list_format的字段名一致。两个参数均带默认值因此空调用curl http://127.0.0.1:6006/test-audio/即可立即验证服务连通性。4. 模型加载配置tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_codeTrue, torch_dtypetorch.bfloat16, device_mapauto) model.generation_config GenerationConfig.from_pretrained(mode_name_or_path) model.generation_config.pad_token_id model.generation_config.eos_token_id model.eval()trust_remote_codeTrueQwen-Audio 依赖模型仓库内的自定义代码模型结构、from_list_format等必须开启torch_dtypetorch.bfloat16以 BF16 半精度加载显著降低显存占用24G 显卡可容纳device_mapauto由 accelerate 自动把各层分配到可用设备单卡即整卡多卡自动切分pad_token_id eos_token_idQwen 系列 pad token 默认与 eos 相同避免生成时报 pad 相关错误model.eval()切换为推理模式关闭 Dropout 等训练行为。5. Uvicorn 启动参数uvicorn.run(app, host0.0.0.0, port6006, workers1)host0.0.0.0监听所有网卡允许局域网/端口映射访问port6006选用 AutoDL 默认开放的端口之一可在 AutoDL 控制台将 6006 端口映射到本地从而在本地浏览器/代码中直接调用 APIworkers1单进程即可因为模型加载在全局作用域多 worker 会导致重复占用显存。启动服务与接口验证在终端执行cd /root/autodl-tmp python api.py模型加载完成后终端出现Uvicorn running on http://0.0.0.0:6006即表示服务启动成功日志中若出现import flash_attn rotary fail之类的警告属于可选加速组件缺失不影响推理方式一curl 直接调用curl http://127.0.0.1:6006/test-audio/该请求使用默认参数/root/autodl-tmp/1272-128104-0000.flacwhat does the person say?返回模型对测试音频内容的文字转述。方式二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, paramsparams) # 提取所需信息 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: Wed, 06 Dec 2023 09:20:51 GMT }可见模型正确完成了听懂语音 理解文本问题 用中文作答的完整链路。响应 JSON 各字段含义字段含义response模型生成的文本回答/test-audio/端点直接返回{response: ...}status_codeHTTP 状态码200 表示成功time服务端请求处理时间/audio/端点或响应头日期requests 示例部署要点与常见问题temp 目录POST /audio/端点把上传文件写入temp/启动服务前建议先mkdir -p /root/autodl-tmp/temp避免首次调用报文件不存在端口映射若在 AutoDL 等云平台运行需在控制台完成 6006 端口的本地映射映射后本地即可访问http://127.0.0.1:6006也可参考仓库通用教程 02-AutoDL开放端口.md显存占用BF16 精度 单进程部署约需 1520G 显存24G 显卡余量充足并发量较大时应通过队列/限流保护单进程服务多轮对话model.chat的history参数可回传以实现多轮音频文本混合对话本示例为单轮演示transformers 版本教程锁定了transformers4.32.0升级版本可能触发 remote code 兼容性问题若必须升级请先在测试环境验证外部依赖缺失告警启动日志中flash_attn等告警不影响基础推理如需极致性能可另行安装对应加速库。小结与延伸至此Qwen-Audio-Chat 已被封装为一个可复用的 HTTP 服务业务方只需通过POST /audio/上传音频或GET /test-audio/指定音频路径即可获得模型的文本回答。本仓库 models/Qwen-Audio 目录还提供了基于 Gradio 的 02-Qwen-Audio-chat WebDemo.md实现了上传/录音/多轮对话等交互能力仓库总览见 support_model.md 中 Qwen-Audio 一节其中记录了本教程的作者与链接索引。掌握本流程后读者可以将其迁移到仓库内其他模型的 FastAPI 部署教程如 Qwen2、ChatGLM、DeepSeek 等均位于 models 目录形成一套通用的开源大模型 API 化方法论。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表