服务端上传文件与内部传path接口;centOS8系统中:conda虚拟环境安装ffmpeg,导致supervisor管理进程时,访问不到ffmpeg的问题;copilot提示词研究(建立一个模型服务化的一整套架构设计和约束定义);
1.服务端上传文件与内部传path接口;
最近让ai写代码,它一般会分为服务端上传文件与内部传path两个接口;
一、核心原因:信任边界不一样(这是根本)
(1)服务端上传文件(multipart / bytes)
👉来源主要是:前端 / 第三方系统、外网用户、不可信来源;
(2)内部传 path(/data/audio/xxx.wav)
👉微服务之间,同一台机器 / 同一集群,调度系统、任务系统、队列消费者;
你信任调用方,你们共享存储(本地 / NAS / 对象存储挂载),path 本身就是一个“资源引用”
👉最终的工程办法
🌐 对外 API(不信任)
POST /funasr/transcribe
Content-Type: multipart/form-data
上传文件 👉 做格式校验 👉 存对象存储 / 临时目录 👉 生成内部 path
🧠 内部 API(可信)
只负责推理 👉 不碰权限、不碰存储策略 👉 快、稳、可扩展
2.centOS8系统中:conda虚拟环境安装ffmpeg,导致supervisor管理进程时,访问不到ffmpeg的问题;
👉我是使用的centOS8,centOS8本身不自带ffmpeg,需要下载安装。
执行以下命令sudo yum install ffmpeg
然后遇到了经典的 依赖缺失 问题。错误显示 ffmpeg 需要 libSDL2,但你的标准仓库里找不到它。这是因为 ffmpeg 在 CentOS 上通常不在官方基础库(BaseOS)里。遂放弃;
👉直接在conda环境中安装ffmpeg。
conda install -c conda-forge ffmpeg
成功,并且在vscode中能够正常运行;
👉supervisor管理服务进程
supervisor是一个应用级进程管理,以往的模型服务化后都是用supervisor进行管理;
按部就班,配置完以后,外部访问报出No such file or directory: 'ffmpeg'这样的错误。
👉ffmpeg 这种复杂的二进制工具,在执行某些编解码操作时内部可能会:
(1)调用外部 Shell 命令。
(2)寻找系统动态库加载器。
(3)触发其他系统级的辅助进程。
👉找不到ffmpeg文件夹问题No such file or directory: 'ffmpeg'
这个问题核心原因在于:Supervisor 环境确实无法自动获取系统变量。
👉问题也包含Python包和系统二进制程序的区别。
(1)Python包的调用
只要你在 Supervisor 的 command 里指定了 Conda 环境下的那个 python 解释器路径。
(2)系统二进制程序的调用
Supervisor 会跳出 Python 的范围,去 Linux 的 $PATH 环境路径里搜索名为 ffmpeg 的文件。
然后Supervisor 环境确实无法自动获取系统变量,最终导致Supervisor找不到ffmpeg这个系统二进制程序,遂报错。1.
👉问题最终解决
在Supervisor配置中全路径注入environment
command=/home/user/miniconda3/envs/FunASR/bin/python -m uvicorn main:app --host 0.0.0.0 --port 8005
directory=/home/user/models/funasr
environment=PATH="/home/user/miniconda3/envs/FunASR/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
autostart=true
autorestart=true
最终解决了这个Supervisor找不到系统变量问题。
3.copilot提示词研究(建立一个模型服务化的一整套架构设计和约束定义);
(1) 结构化目录:定义“各司其职”即便简单,也要把“跑模型的”和“接接口的”分开。
👉提示词:“我正在使用 FastAPI 部署模型服务。业务不复杂,请帮我设计一个轻量但清晰的目录结构。要求:将 API 定义(路由)、业务逻辑(处理上传/转换)和模型加载(推理)分开。提供一个 core/ 目录用于存放模型配置和环境变量加载。提供一个 services/ 目录专门处理业务流程。请解释每个文件夹存在的意义,确保边界清晰。”
(2) 模型单例化:防止内存爆炸模型部署最怕重复加载模型。你需要定义一个“模型边界”。
👉提示词:“在我的项目中,模型加载非常耗时且占用巨大显存。请帮我写一个 ModelManager 类,采用单例模式。要求:模型只在服务启动时加载一次。提供一个统一的推理接口供 API 调用。确保推理接口是线程安全的(如果适用),并解释如何避免并发请求导致显存溢出。”
(3) 文件流转边界:从 UploadFile 到 Inference,定义好数据怎么走。
👉提示词:“请帮我设计一个文件处理的流转规范。场景: 外部调用通过 API 上传文件,存入临时文件调用模型识别;内部调用输入路径调用模型识别。要求:定义一个服务类。明确输入边界:API 层只负责接收 UploadFile和path 并传给服务类。明确处理边界:服务类负责调用模型。明确清理边界:确保处理完后删除临时文件,防止磁盘写满。”
(4) 异常捕获边界:不要让模型错误导致服务崩溃模型报错(比如 GPU 内存不足)不应该让 Uvicorn 挂掉。
👉提示词:“请为我的模型服务设计一套异常处理机制。要求:区分‘用户输入错误’(文件格式不对)、‘处理错误’和‘模型推理错误’。使用 FastAPI 的 exception_handler 捕获这些错误,并返回统一的 JSON 响应,而不是直接让程序抛出Traceback。”
浙公网安备 33010602011771号