VLLM推理大模型顯存不夠后,導致程序引擎崩潰的調優方案嘗試

背景介紹

  • 硬件
    A800 80G
  • 模型
    chat-glm4-9b-128K
  • 環境
    生產
  • 正常顯存占用情況
    glm4 占用32GB
    其他顯存工占用38GB左右
    總共剩余10GB。

問題描述

推理時報錯日志,由于內網環境無法拿出日志,與下面的類似。

  File "/data/miniconda3_new/envs/vllm-new/lib/python3.10/site-packages/vllm/engine/async_llm_engine.py", line 654, in add_requestself.start_background_loop()File "/data/miniconda3_new/envs/vllm-new/lib/python3.10/site-packages/vllm/engine/async_llm_engine.py", line 476, in start_background_loopraise AsyncEngineDeadError(
vllm.engine.async_llm_engine.AsyncEngineDeadError: Background loop has errored already.

再往前追述日志,發現有超長文本請求,字符長度10萬左右,顯存不夠報類似如下錯誤

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 10.78 GiB

問題分析

根本原因還是顯存不夠,但是一個請求推理顯存不夠后這個請求失敗應該釋放調占用的顯存,不應該影響之后的請求才對。

引擎啟動代碼如下:

if __name__ == "__main__":MODEL_PATH = sys.argv[1]tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)engine_args = AsyncEngineArgs(model=MODEL_PATH,tokenizer=MODEL_PATH,# 如果你有多張顯卡,可以在這里設置成你的顯卡數量tensor_parallel_size=1,dtype="bfloat16",#dtype="half",trust_remote_code=True,# 占用顯存的比例,請根據你的顯卡顯存大小設置合適的值,例如,如果你的顯卡有80G,您只想使用24G,請按照24/80=0.3設置gpu_memory_utilization=0.4,enforce_eager=True,worker_use_ray=False,disable_log_requests=True,max_model_len=MAX_MODEL_LENGTH, # 這里是128000)engine = AsyncLLMEngine.from_engine_args(engine_args)uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)

引擎調用部分代碼如下:

sampling_params = SamplingParams(**params_dict)
try:async for output in engine.generate(inputs=inputs, sampling_params=sampling_params, request_id=f"{time.time()}"):output_len = len(output.outputs[0].token_ids)input_len = len(output.prompt_token_ids)ret = {"text": output.outputs[0].text,"usage": {"prompt_tokens": input_len,"completion_tokens": output_len,"total_tokens": output_len + input_len},"finish_reason": output.outputs[0].finish_reason,}yield ret
except Exception as e:logger.error(f"錯誤:{e}")raise e
finally:gc.collect()torch.cuda.empty_cache()
  1. 引擎崩潰后每次也是這里的logger.error輸出的Background loop has errored already.
  2. 第一次內存不夠報錯日志也是這里有顯示,并且有調用finally模塊中的清空緩存邏輯。
  3. 還是重復上面的問題,一個請求不應該導致整個引擎崩潰,從而導致之后的請求也無法處理,不知道是否是vllm的bug??? 看到能多人也在github上提了issue,但是目前無解決方案。參考:
    https://github.com/vllm-project/vllm/issues/6361

解決方案

經過上面的分析我們知道是顯存不夠引起的,我們這里只對顯存不夠做調優來減少這種情況發生,并不能解決顯存不夠后引發的引擎崩潰問題。
做如下參數調整

  • enable-chunked-prefill = True
  • max_num_batched_tokens = 8192
  • max_num_seqs = 10

參數介紹

enable-chunked-prefill

  • 是 vLLM 中的一個優化功能,主要用于處理長上下文或大提示(prompt)情況下的內存和計算效率問題。默認False

max_num_batched_tokens

預填充階段的最大批處理token數:

  • 當 enable-chunked-prefill=True 時,決定每個chunk(塊)的最大token數

  • 解碼階段的最大批處理token數:限制解碼階段同時處理的token總數

  • 工作原理
    當啟用 chunked prefill 時:
    系統將長prompt分割為多個chunk
    每個chunk的token數不超過 max_num_batched_tokens
    依次處理這些chunk
    例如:
    如果prompt有5000 tokens,max_num_batched_tokens=2048
    將被分割為:2048 + 2048 + 904 tokens的三個chunk

  • 默認值
    不同的顯卡,不同的內存默認值不一樣
    詳細邏輯見官方代碼:https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py

  • 建議
    高端GPU(如A100 80GB):可設較大值(4096-8192)
    消費級GPU(如3090 24GB):建議較小值(1024-2048)

max_num_seqs
控制并發數量,如果你的顯存不夠是由于并發引起的,可以設置這個參數。

其他參數:

  • max_model_len : 允許模型處理的最大token數量,可根據實際情況限制,由于我們就是要處理長文本的,所以我這里沒有調整。
  • gpu_memory_utilization GPU顯存占比,盡量初始化時小一點,預留足夠的顯存空間。

總結

經測試以上參數調整后可以顯著控制GPU的占用情況,減少OutOfMemory情況的發生,提高系統可用性,后續也會嘗試升級VLLM版來解決崩潰后無法處理后續請求的問題,但是顯存都是稀缺資源,本身也要做好調優。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80628.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Nacos】env NACOS_AUTH_IDENTITY_KEY must be set.

【Nacos】env NACOS_AUTH_IDENTITY_KEY must be set. 問題描述 env NACOS_AUTH_IDENTITY_KEY must be set.原因分析 在 .env 文件中設置 Nacos 身份驗證相關的所有必要環境變量。 解決方案 添加到 .env 文件中 NACOS_AUTH_IDENTITY_KEYAuthorization NACOS_AUTH_IDENTITY…

C++語法基礎(下)

(注:在看本文是如果感覺內容有點突兀,請先瀏覽《C語法基礎(上)》這篇文章幫助更好理解) 一.缺省參數 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參…

力扣Hot100(Java版本)

1. 哈希 1.1 兩數之和 題目描述: 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同…

FCB文件疑問+求助:01 百度網盤視頻自動生成AI筆記pdf會出現對應fcb文件-作用待詳解

疑問求助:01 百度網盤視頻自動生成AI筆記pdf會出現對應fcb文件-作用待確認確認詳解.md 一、疑惑起因 百度網盤視頻自動生成AI筆記pdf會出現對應fcb文件,我可以刪除fcb文件么?影響什么?如何打開fcb其內容是啥?直觀看刪…

【數據結構】——棧和隊列OJ

一、有效的括號 題目鏈接: 20. 有效的括號 - 力扣(LeetCode) 題目的要求很簡單,就是要求我們判斷其輸入的括號字符串是否是有效的括號,那么我們要如何判斷呢? 我們可以這樣,我們遍歷出傳入的…

開源免費無廣告專注PDF編輯、修復和管理工具 辦公學術 救星工具

各位PDF處理小能手們!我跟你們說啊,今天要給大家介紹一款超牛的國產開源PDF處理工具,叫PDFPatcher,也叫PDF補丁丁。它就像一個PDF文檔的超級修理工,專門解決PDF編輯、修復和管理的各種難題。 這軟件的核心功能和特點&a…

【Bluedroid】藍牙 HID DEVICE 初始化流程源碼解析

本文深入剖析Android藍牙協議棧中HID設備(BT-HD)服務的初始化與啟用流程,從接口初始化、服務掩碼管理、服務請求路由到屬性回調通知,完整展現藍牙HID服務激活的技術路徑。通過代碼邏輯梳理,揭示服務啟用的核心機制&…

2025年項目管理軟件革命:中國技術主權與全球創新浪潮的交鋒

全球項目管理軟件市場正在經歷一場由多重技術疊加引發的結構性變革。根據Gartner最新預測,到2025年項目管理工具市場規模將突破220億美元,其中中國市場增速達38%,遠超全球平均水平。這場變革不僅關乎工具功能迭代,更深刻影響著企業…

計算機組成與體系結構:組相聯映射(Set-Associative Mapping)

目錄 🧩 映射方式問題回顧 🏗? 組相聯映射 工作流程 地址結構 ?? 替換策略 示例: 優點 ?? 與其他映射方式對比 🧩 映射方式問題回顧 直接映射的問題: 優點:實現簡單,查找速度快…

機器學習第八講:向量/矩陣 → 數據表格的數學表達,如Excel表格轉數字陣列

機器學習第八講:向量/矩陣 → 數據表格的數學表達,如Excel表格轉數字陣列 資料取自《零基礎學機器學習》。 查看總目錄:學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章:DeepSeek R1本地與線上滿血版部署:…

基于Spring AI實現多輪對話系統架構設計

文章目錄 基于Spring AI實現多輪對話系統架構設計 前言 一、多輪對話系統核心架構 1.1 架構概覽 1.2 Spring AI核心優勢 二、ChatClient與多輪對話設計 2.1 ChatClient的特性與角色 2.2 實現多輪對話方法 三、Advisors攔截器機制 3.1 Advisors概念與工作原理 3.2 對…

C++中的虛表和虛表指針的原理和示例

一、基本概念 1. 什么是虛函數(virtual function)? 虛函數是用 virtual 關鍵字修飾的成員函數,支持運行時多態(dynamic polymorphism)。通過基類指針或引用調用派生類重寫的函數。 class Base { public:…

FPGA:XILINX FPGA產品線以及器件選型建議

本文將詳細介紹Xilinx(現為AMD的一部分)當前的FPGA產品線及其主要特點,并提供器件選型的建議。以下內容基于Xilinx FPGA的最新信息,涵蓋產品系列、特性及選型指導。由于Xilinx已被AMD收購,產品線以AMD Xilinx品牌為主&…

【C++】多線程和多進程

在C++中,多線程通信(同一進程內的線程間交互)和進程間通信(IPC,不同進程間的數據交換)是構建并發系統的核心技術。以下是兩種通信機制的詳細介紹和典型實現: 一、多線程通信(線程間同步與數據共享) 1. 共享內存與同步原語 通過全局變量或對象成員變量實現數據共享,…

PC Cleaner軟件,它能幫助用戶輕松清理和優化電腦,提升系統性能。

不用破解就能用!這款超神的電腦清理 Pro 版,絕了! 寶子們,我是你們的數碼小助手藍木云!不知道大家有沒有這種感覺,電腦用久了,就像住久了沒打掃的屋子,越來越 “亂”,運…

linux中fork()函數的小問題

問題描述&#xff1a;分析下列代碼&#xff0c;分別能產生多少a // 1 for(int i0; i<3; i){ printf("a\n"); fork(); }// 2 for(int i0; i<3; i){ fork(); printf("a\n"); }// 3 for(int i0; i<3; i){ fork(); printf("a"); } fflus…

阿克曼-幻宇機器人系列教程2- 機器人交互實踐(Topic)

在上一篇文章中&#xff0c;我們介紹了兩種登錄機器人的方式&#xff0c;接下來我們介紹登錄機器人之后&#xff0c;我們如何通過topic操作命令實現與機器人的交互。 1. 啟動 & 獲取topic 在一個終端登錄樹莓派后&#xff0c;執行下列命令運行機器人 roslaunch huanyu_r…

51c嵌入式~電路~合集27

我自己的原文哦~ 一、7805應用電路 簡介 如上圖&#xff0c;7805 集成穩壓電路。 7805是串聯式三端穩壓器&#xff0c;三個端口分別是電壓輸入端&#xff08;IN&#xff09;&#xff0c;地線&#xff08;GND&#xff09;&#xff0c;穩壓輸出&#xff08;OUT&#xff09;…

Vitrualbox完美顯示系統界面(只需三步)

目錄 1.使用vitrualbox的增強功能&#xff1a;?編輯 2.安裝增強功能&#xff08;安裝完后要重啟虛擬機&#xff09;&#xff1a; 3. 調整界面尺寸&#xff08;如果一個選項不行的話&#xff0c;就多試試其他不同的百分比&#xff09;&#xff1a; 先看看原來的&#xff0c;…

2025年第十六屆藍橋杯軟件賽省賽C/C++大學A組個人解題

文章目錄 題目A題目C&#xff1a;抽獎題目D&#xff1a;紅黑樹題目E&#xff1a;黑客題目F&#xff1a;好串的數目 https://www.dotcpp.com/oj/train/1166/ 題目A 找到第2025個素數 #include <iostream> #include <vector> using namespace std; vector<i…