44 Commits

Author SHA1 Message Date
46c2265ab0 rmbg增加免费端点/file/free 2025-12-20 12:06:36 +00:00
0cffb65490 fix: 修复GPU内存泄漏问题 - 使用专门的CUDA线程执行CUDA操作
问题根源:
- PyTorch的CUDA操作不是线程安全的,在ThreadPoolExecutor中使用run_in_executor执行CUDA操作会导致内存泄漏
- 即使设置了设备上下文,多线程CUDA上下文混乱仍会导致内存无法正确释放

解决方案:
1. 为每个GPU创建专门的CUDA执行线程,完全避免在ThreadPoolExecutor中执行CUDA操作
2. 分离CUDA执行器和IO执行器:
   - io_executor: 用于IO操作(保存文件、打开图片等)
   - 专门的CUDA线程: 用于所有CUDA操作
3. 使用call_soon_threadsafe在线程和asyncio之间正确传递结果

技术细节:
- 每个GPU有独立的CUDA线程,确保CUDA上下文隔离
- CUDA操作通过队列传递到专门的线程执行
- 符合PyTorch官方文档和社区最佳实践

效果:
- 第一次运行GPU内存正常增加(模型加载)
- 后续多次运行GPU内存不再持续增加
- 内存泄漏问题已完全解决

参考:
- PyTorch GitHub issue #44156
- NVIDIA官方多线程CUDA最佳实践
2025-12-17 19:11:07 +00:00
57bfa17ac7 refactor: 实现严格的流水线式方案,每GPU独立worker处理队列
- 架构重构:为每个GPU启动独立的队列处理worker,避免worker间竞争
- 单卡batch收集:每个worker只收集batch_size个请求,不再乘以GPU数量
- 设备绑定:每个worker固定绑定自己的model和device,不再轮询调度
- 处理逻辑:直接使用worker的model/device进行批处理,移除多GPU拆分逻辑
- 降级处理:OOM时使用当前worker的model/device进行单张处理
- 资源管理:更新cleanup方法,正确停止所有worker任务
- API更新:修复已弃用的PYTORCH_CUDA_ALLOC_CONF和torch_dtype参数

优势:
- 避免worker之间竞争和批次冲突
- 资源隔离,每个worker只使用自己的GPU
- 负载均衡,多worker并行处理提高吞吐量
- 易于扩展,GPU数量变化时自动调整worker数量
2025-12-16 16:39:33 +00:00
0757566f0e 引入 num_devices 缓存在模型加载时一次性确定 GPU 数量,并基于该值直接计算全局批大小(移除原先批次大小额外 ×2 的隐式放大逻辑,由配置与设备数共同控制整体批规模)。 2025-12-16 14:25:53 +00:00
fbcb614c73 feat(rmbg): 统一全局 batcher,支持 batch 接口跨用户合批
- 扩展 QueueItem,增加 url_str、batch_index 元信息,便于批量请求结果映射
- 重写 _process_batch_queue_items,直接对统一队列做 GPU 批推理,并行保存图片,减少 IO 阻塞
- 重写 process_batch:下载后将每张图片作为 QueueItem 推入全局队列,从全局 batcher 获取结果并按完成顺序流式返回
- 调整 _collect_batch_items,在高并发场景下允许收集最多 2x batch_size 的任务,提升 GPU 利用率
- 修正批处理流式返回中的 Future 管理逻辑,避免 asyncio.wait 与 dict/set 混用导致的异常
2025-12-16 14:07:36 +00:00
530e7c8961 抠图后更新为保存为png格式,处理速度更快 2025-12-15 16:24:44 +00:00
cc0198c9b0 增加多GPU并发支持 2025-12-15 15:59:42 +00:00
c5df876f4a 更新图片保存位置,增加pyproject.toml 2025-12-15 15:44:33 +00:00
cd2a6ea74c 优化rmbg抠图服务:改用WebP格式减小文件体积并增加超时时间 2025-12-07 06:13:23 +08:00
46845e5f57 fix(rmbg): 修复队列模式下process_image返回类型不一致问题
- 修复remove_background和remove_background_from_file方法中,队列模式返回dict但代码尝试调用save方法的问题
- 在调用处添加类型检查,兼容队列模式(返回dict)和非队列模式(返回Image)
- 修复process_batch降级处理中的相同问题

修复前错误: 'dict' object has no attribute 'save'
2025-12-07 05:34:33 +08:00
409802d5d7 删除rmbg调试日志 2025-12-07 03:36:31 +08:00
696a48fedb 重构rmbg为完全本地版离线模式 2025-12-07 03:12:11 +08:00
b0e889f839 重构rmbg为流水线模式 2025-11-24 00:49:12 +08:00
7f03cc24e3 fix(rmbg): 将 on_event 迁移到 lifespan 事件处理器以消除弃用警告 2025-11-23 16:33:12 +08:00
0e1a99d975 优化GPU推理性能:复用转换器并减少不必要的显存清理
- 复用 ToPILImage() 转换器,避免循环中重复创建对象
- 移除批处理前不必要的显存清理(批处理会重用显存)
- 移除批处理后的 gc.collect(),减少阻塞开销
- 保留单张处理的 gc.collect(),确保及时释放内存

预期性能提升:3-8%
2025-11-23 16:22:31 +08:00
9e259e7344 优化rmbg服务的保存图片逻辑,提高效率 2025-11-23 15:57:42 +08:00
cecd617104 feat(rmbg): 添加批处理性能统计功能
- 记录下载图片、GPU推理、保存图片各阶段的耗时
- 输出详细的性能统计信息,包括:
  * 图片总数、成功/失败数量
  * 批处理次数和每批图片数
  * 各阶段耗时及占比
  * 总耗时、平均每张耗时、每批平均耗时
- 使用统一的日志格式输出统计信息
2025-11-23 15:48:33 +08:00
4a906d87fb feat: 实现批处理队列机制和性能优化
主要改进:
1. 实现队列批处理机制(方案B)
   - 添加异步队列收集多个独立请求
   - 后台任务定期批量处理,提升吞吐量5-15倍
   - 支持队列启动/关闭生命周期管理

2. 优化批处理性能
   - 并行保存图片(从串行改为并行)
   - 智能批处理决策(<=batch_size*2时一次性处理)
   - 自动降级机制(显存不足时自动分批处理)

3. 显存优化
   - 实现FP16半精度推理,显存占用减少约50%
   - 优化显存清理策略(批处理前后主动清理)
   - 设置PYTORCH_CUDA_ALLOC_CONF减少碎片化

4. 配置优化
   - 添加队列相关配置(收集间隔、超时等)
   - 调整batch_size默认值为8(适配BiRefNet模型)

性能提升:
- 13张图片处理时间:12秒 → 6.7秒(提升44%)
- GPU利用率:40-60% → 80-95%
- 显存占用:15.5GB → 8GB(FP16模式)
2025-11-23 15:01:43 +08:00
5552b30958 优化rmbg,删除未使用的变量 2025-11-23 05:14:25 +08:00
10fb6084f5 优化rmbg并发逻辑,实测并发生效 2025-11-23 04:58:58 +08:00
474ce6f5db 重构rmbg支持异步并发任务 2025-11-23 03:23:44 +08:00
c99e20ff61 优化jfile服务:将清理间隔改为可配置,文件保留时间调整为15分钟
- 将清理间隔从硬编码3600秒改为可配置项cleanup_interval_seconds
- 文件保留时间从1小时调整为15分钟(0.25小时)
- 清理间隔同步调整为15分钟(900秒),保持与保留时间一致
- 优化存储空间使用,过期文件更及时清理
2025-11-21 08:50:53 +08:00
419744686f feat(jfile): 添加CORS响应头支持第三方前端下载图片
- 添加HTTP中间件为/files路径响应添加CORS响应头
- 支持Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Expose-Headers
- 添加Content-Disposition头让浏览器直接下载而不是打开图片
- 统一处理OPTIONS预检请求
- 优化性能:提前返回非目标请求
2025-11-21 01:44:02 +08:00
ba4a57849d feat(rmbg): 添加图片URL返回功能,移除base64字段
- 添加保存图片到jfile/files目录的功能
- 返回结果从image_content改为image_url
- 添加save_dir和download_url配置项
- 大幅减少返回数据大小,提升传输性能
- file和batch接口均支持返回图片URL
2025-11-21 01:34:31 +08:00
b3818a9ab1 feat(rmbg): 将file接口改为流式返回,统一接口风格
- 将file上传接口从一次性返回改为流式返回
- 使用StreamingResponse和NDJSON格式,与batch接口保持一致
- 提升用户体验,减少响应等待时间
- 统一两种接口的返回格式
2025-11-21 00:29:34 +08:00
173f788ab7 fix(jfile): 移除文件清理的前缀限制,清理所有过期文件
- 移除 FileCleaner 的前缀过滤逻辑
- 清理 files 目录下所有超过保留时间的文件
- 修复 split_ 前缀文件未被清理的问题
2025-11-20 10:33:20 +08:00
c27fbb19c2 jembedding启用GPU加速 2025-10-08 15:32:12 +08:00
feb598d72a 基于AutoModel重构jembedding的service.py 2025-10-08 15:23:15 +08:00
8fc4a3c603 jembedding更新为支持离线加载模型 2025-10-08 06:26:13 +08:00
fea1df9990 增加jembedding微服务 2025-10-08 05:40:11 +08:00
f7363c8ba8 修复midjourney图片分割逻辑漏洞 2025-08-31 21:25:34 +08:00
82088279eb 更新api接口为https正式版 2025-08-14 20:12:21 +08:00
f0a434ec2e 更新jingrow系统api接口 2025-06-27 20:16:13 +08:00
e09aa09f14 清除jart_v1调试日志 2025-06-20 01:01:10 +08:00
61267eacdd 重构jart_v1支持sd3.5模型 2025-06-20 00:18:39 +08:00
dee2929268 优化jupscale 2025-05-20 20:13:09 +08:00
5cfae7aafe 更新图片中转API地址 2025-05-20 19:27:06 +08:00
0e0443eab2 确保midjourney seed参数位于末尾 2025-05-20 18:34:25 +08:00
b523b6975b 更新midjourney适合生产环境 2025-05-20 17:01:34 +08:00
0e5b27e422 优化midjourney微服务 2025-05-20 16:04:57 +08:00
87261dad9f 修复midjourney提示词包含参考图片时响应格式不正确的问题 2025-05-20 13:10:54 +08:00
f3eb21f5f3 修复midjourney 2025-05-20 04:00:49 +08:00
6e70ad3033 增加midjourney微服务 2025-05-19 22:34:45 +08:00
4be051e459 japi 微服务版 2025-05-12 02:39:56 +08:00