1.我用3090的卡跑推理,是openbuddy-mistral-7b 我用infer.sh脚本推理的时候显存占用47%,但是再启一个推理进程的话,就阻塞不动了,能一个卡同时启动2个同样推理吗? 2. 用你给的那个脚本(打印response)去推理的话,报 CUDA out of memory. Tried to allocate 204.00 MiB (GPU 0; 23.69 GiB total capacity; 1.49 GiB already allocated; 40.69 MiB free; 1.51 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CON 这两个问题要向您求助
如果您想同时运行多个推理进程,可以考虑使用多张显卡,并确保每个进程在独立的显卡上运行,以充分利用硬件资源。
对于 CUDA out of memory 的错误,请尝试以下解决方法:
减小批量大小(batch size):减小每个推理进程中使用的批量大小,可以减少显存的需求。
减小模型的尺寸:如果模型较大,可以考虑将其缩小,以减少内存消耗。
使用更少的显卡内存操作:确保在推理期间没有额外的显卡内存操作,例如不需要存储过多的中间结果。
设置 PyTorch 的环境变量来调整分配和释放显存的策略:
export CUDA_LAUNCH_BLOCKING=1
export PYTORCH_CUDA_ALLOC_CONF=1
这些环境变量可以帮助您更好地管理显存,并避免碎片化问题。但请注意,这可能会导致一些性能损失。
对于第一个问题,是否可以在一个 GPU 上同时运行两个推理进程取决于多个因素。尽管从理论上讲,你确实可以尝试在一个 GPU 上并行地运行多个推理任务,但实际效果会受到限制。以下是一些可能影响到性能的因素:
显存占用:每个推理进程都会占用一定的显存资源。如果显存被过度分配,那么新启动的进程可能会因缺乏足够的显存而阻塞。
硬件限制:虽然 NVIDIA GeForce RTX 3090 是一款非常强大的消费级显卡,但它仍然存在一些物理上的限制,如带宽、内存访问速度等。在高负载下,这些限制可能导致并行推理的性能下降。
驱动和软件支持:GPU 驱动程序和框架(如 PyTorch 或 TensorFlow)通常会有一些内在的优化来处理多进程环境,但这并不意味着它们能完美地处理所有情况。
模型大小和复杂性:如果你正在使用的是大型或复杂的模型,那么单个模型可能就已经占用了大部分的显存资源,这使得在同一张卡上并行运行多个模型变得困难。
对于第二个问题,报错信息表明你的显存已经耗尽,无法为新的操作分配更多空间。你可以尝试以下方法来解决这个问题:
减少 batch size:如果你是通过批处理的方式进行推理,尝试减小批处理的大小,以降低每次推理所需的显存。
释放显存:确保在每次推理完成后,显存中的数据都被正确释放。在 Python 中,可以通过 torch.cuda.empty_cache()
函数手动清空缓存,从而释放一部分显存。
调整参数:PyTorch 提供了一些与内存管理相关的参数,如 max_split_size_mb
。尝试按照错误提示的信息设置这些参数,看看能否避免显存碎片化。
升级硬件:如果以上方法都无法解决问题,并且你的工作流程需要更高的显存容量,那么考虑升级到具有更大显存的 GPU 可能是一个解决方案。
跨卡调度:如果你有多块 GPU,在 OpenBuddy 等工具的支持下,你可以将推理任务分布到不同的 GPU 上,这样可以更有效地利用资源。
监控和调试:使用像 nvidia-smi 这样的工具监视 GPU 的状态,找出哪些过程正在占用大量的显存,然后针对性地优化代码。
https://help.aliyun.com/zh/viapi/developer-reference/api-start-the-service?spm=a2c4g.11174283.0.i3