使用streamlit實現vLLM多實例信息統一監控

本文代碼和配置文件實現了一個基于 Streamlit 和 FastAPI 的前后端分離的應用程序,用于管理和展示 VLLM(Very Large Language Model)實例的信息。以下是代碼和配置文件的總結摘要:

概要

功能概述

  1. 前后端啟動方式

    • 使用 Streamlit 啟動前端界面,可通過默認端口或指定端口和 IP 啟動。
    • 使用 Uvicorn 啟動 FastAPI 后端服務,用于提供模型數據的 API 接口。
  2. 前端功能(Streamlit)

    • 支持可選的登錄認證功能,通過 YAML 配置文件控制是否啟用。
    • 展示 VLLM 模型的概覽信息,包括模型名稱、路徑、IP 地址、端口、任務 ID、啟動時間等。
    • 從后端 API 獲取模型數據,并動態展示模型的詳細信息。
    • 提供刷新按鈕,用于重新從后端獲取數據并更新前端顯示。
  3. 后端功能(FastAPI)

    • 提供 /models/models/{model_name} 兩個 API 接口。
    • /models 接口返回所有 VLLM 模型的列表信息。
    • /models/{model_name} 接口根據模型名稱返回特定模型的詳細信息。
    • 使用 ps 命令解析系統進程信息,提取 VLLM 模型的運行參數和啟動時間。
  4. 配置文件

    • counter.yaml:用于配置后端 API 的端口號和是否啟用前端登錄認證。
    • .streamlit/secrets.toml:存儲前端登錄認證的用戶名和密碼。
  5. 模型信息展示

    • 模型信息通過 st.expander 展開式組件展示,包含模型的基本信息和參數。
    • 計算模型的運行時間(uptime),并以友好的格式顯示。

技術棧

  • 前端:Streamlit,用于快速搭建交互式 Web 界面。
  • 后端:FastAPI,用于構建高效的 API 服務。
  • 數據解析:通過 ps 命令獲取系統進程信息,并解析出 VLLM 模型的運行參數。
  • 配置管理:使用 YAML 和 TOML 文件分別管理后端配置和前端認證信息。

使用場景

該應用適用于管理和監控運行在服務器上的 VLLM 模型實例,通過前端界面直觀地展示模型的運行狀態和參數配置,方便用戶進行管理和調試。

代碼展示

應用前后端啟動方式

#默認啟動
streamlit run app.py
#Local URL: http://localhost:8501#指定端口 ip
streamlit run app.py --server.address 0.0.0.0 --server.port 8501# unicorn啟動后端fastapi
uvicorn api:app --reload --port 8880

Streamlit 代碼(前端頁面)

import streamlit as stimport requestsfrom datetime import datetime# 設置頁面配置st.set_page_config(page_title="VLLM 概覽",page_icon="📊")# 登錄認證try:import yamlwith open('counter.yaml') as f:config = yaml.safe_load(f)need_auth = config.get('web.auth', False)except Exception as e:need_auth = Falseif need_auth:if 'authenticated' not in st.session_state:st.session_state['authenticated'] = Falseif not st.session_state['authenticated']:st.header("請登錄")username = st.text_input("用戶名")password = st.text_input("密碼", type="password")if st.button("登錄"):if username == st.secrets["auth"]["vstu"] and password == st.secrets["auth"]["vstp"]:st.session_state['authenticated'] = Truest.rerun()else:st.error("用戶名或密碼錯誤")st.stop()# 頁面標題st.header("📊 VLLM 模型概覽")# 模擬API獲取數據函數def fetch_vllm_models():# 從配置文件讀取端口號try:import yamlwith open('counter.yaml') as f:config = yaml.safe_load(f)port = config.get('vllm.api.port', 8880)except Exception as e:port = 8880# 調用本地API獲取數據response = requests.get(f"http://localhost:{port}/models")if response.status_code == 200:return response.json()return []# 獲取數據models = fetch_vllm_models()# 計算運行時間def calculate_uptime(start_time_str):start_time = datetime.fromisoformat(start_time_str)uptime = datetime.now() - start_timereturn str(uptime).split('.')[0]# 展示模型信息for model in models:uptime = calculate_uptime(model['start_time'])with st.expander(f"模型: {model['sname']} ({model['name']})      [?? {uptime}]"):col1, col2 = st.columns(2)with col1:st.write(f"**路徑**: {model['path']}")st.write(f"**地址**: {model['ip']}")st.write(f"**端口**: {model['port']}")st.write(f"**任務ID**: {model['pid']}")st.write(f"**啟動時間**: {model['start_time']}")with col2:st.write("**參數**:")for param, value in model['params'].items():st.write(f"- {param}: {value}")# 刷新按鈕if st.button("刷新數據"):st.rerun()

API 代碼

from fastapi import FastAPIfrom datetime import datetimefrom pydantic import BaseModelimport osapp = FastAPI()class ModelInfo(BaseModel):name: strsname: strpath: strip: strport: intstart_time: strparams: dict# 模擬數據models = [{"name": "model1","sname": "model1","path": "/path/to/model1","ip": "192.168.1.100","port": 8000,"start_time": "2023-01-01T10:00:00","params": {"temperature": 0.7, "max_tokens": 100}},{"name": "model2","sname": "model2","path": "/path/to/model2","ip": "192.168.1.101","port": 8001,"start_time": "2023-01-02T11:00:00","params": {"temperature": 0.8, "max_tokens": 200}}]def parse_ps_time(ps_time_str):"""將ps命令返回的時間字符串轉換為ISO格式"""return datetime.strptime(ps_time_str, "%a %b %d %H:%M:%S %Y").isoformat()def parse_vllm_ps_output():"""從ps命令輸出解析vllm模型信息"""try:# 使用os.popen直接執行ps命令process = os.popen('ps aux | grep "vllm serve" | grep -v grep')output = process.read()process.close()if not output:print("No vllm processes found")return []models = []for line in output.splitlines():if "vllm serve" not in line:continue# 提取PIDpid = int(line.split()[1])# 提取完整命令cmd_start = line.find("vllm serve")cmd = line[cmd_start:]# 提取模型路徑model_path = cmd.split("vllm serve ")[1].split()[0]# 提取參數params = {}ip = "localhost"  # 默認IP地址port = 8000     # 默認端口sname = model_path.split('/')[-1]parts = cmd.split()for i, part in enumerate(parts):if part == "--host":ip = parts[i+1]elif part == "--port":port = int(parts[i+1])elif part == "--task":params["task"] = parts[i+1]elif part == "--tensor-parallel-size":params["tensor_parallel_size"] = int(parts[i+1])elif part == "--pipeline-parallel-size":params["pipeline_parallel_size"] = int(parts[i+1])elif part == "--trust-remote-code":params["trust_remote_code"] = Trueelif part == "--api-key":params["api_key"] = Trueelif part == "--served-model-name":sname = parts[i+1]# 獲取進程啟動時間time_process = os.popen(f'ps -p {pid} -o lstart=')start_time_str = time_process.read().strip()time_process.close()models.append({"name": model_path.split('/')[-1],"sname": sname,"path": model_path,"pid": pid,"ip": ip,"port": port,"start_time": parse_ps_time(start_time_str) if start_time_str else datetime.now().isoformat(),"params": params})return modelsexcept Exception as e:print(f"Error parsing ps output: {e}")return []@app.get("/models")async def get_models():return parse_vllm_ps_output()@app.get("/models/{model_name}")async def get_model(model_name: str):for model in models:if model["name"] == model_name:return modelreturn {"error": "Model not found"}

配置文件的內容示例

# counter.yaml
vllm.api.port: 8880
web.auth: false

密碼文件的內容示例

# .streamlit\secrets.toml
[auth]
vstu = "admin"
vstp = "your_password"

效果展示

展示所有的運行中的模型信息,包括當前模型已運行的時間。

下拉菜單可以展示模型的詳細信息,如參數、地址、端口等信息。

總結

這段代碼實現了一個基于 Streamlit 和 FastAPI 的應用,用于管理和展示 VLLM 模型實例的信息。前端通過 Streamlit 提供交互式界面,支持登錄認證和模型信息的動態展示;后端使用 FastAPI 提供 API 接口,從系統進程解析模型數據。配置文件用于設置端口和認證信息。整體功能包括模型概覽、運行時間計算和數據刷新,適合用于監控和管理 VLLM 模型實例。

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

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

相關文章

搭建一個WordPress網站需要多少成本

WordPress 最初可能只是一個簡單的博客平臺。但近年來,它不僅成為了最好的博客平臺,還成為了一個全面的內容管理系統。白宮、jQuery、NGINX、《紐約時報》等企業都把 WordPress 作為自己的網上家園。 不過,它們只是其中的佼佼者。根據 Built…

飛帆控件 post or get it when it has get

我在這里分享兩個鏈接: post_get_it 設計 - 飛帆 有人看出來這個控件是干什么用嗎? 控件的配置:

AI智能體 | 使用Coze一鍵制作“假如書籍會說話”視頻,18個作品狂吸17.6萬粉,讀書博主新標桿!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型_生成對話文案 2.3 代碼_字幕切割 2.4 畫板_對話背景 2.5 循環_對話語音01 2.5.1 選擇器_2 2.5.2 語音合成02 2.5.3 語音合成03 2.5.4 變量聚合_1 2.5.5 視頻合成01 2.6 循環_3 2.6.1 選擇器_3 …

mysql中4種掃描方式和聚簇索引非聚簇索引【爽文一篇】

目錄 一 mysql的聚簇索引&非聚簇索引 1.1 數據表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆蓋索引 二 mysql的4種掃描查詢 2.1 全表掃描 2.2 索引掃描 2.3 覆蓋索引掃描 2.4 回表掃描 2.5 總結 三 mysql的回表查詢詳解 3.1 回表查詢 一 mysql的聚簇索引&非聚簇…

泛微對接金蝶云星空實戰案例技術分享

前言 在企業信息化建設中,OA系統與ERP系統對接往往是一個復雜而關鍵的環節。OA系統通常具有高度的自定義性,其基礎資料和單據可能與ERP系統存在字段不一致等問題。同時,OA系統涉及審批流程及流程發起方定義,增加了對接的復雜性。…

一種資源有限單片機處理cJSON數據的方法

一般單片機處理cJSON格式的數據都直接使用cJSON庫,但對于Ram較小的單片機,由于資源有限,這并不合適,但我們可以根據cJSON數據的特定格式,使用土方法,直接對字符進行查找裁剪即可 //截取字符串str中字符a與…

關于軟件測試開發的一些有趣的知識

文章目錄 一、什么是測試?二、為什么要軟件測試軟件測試三、測試的崗位有哪些四 、軟件測試和開發的區別五、走測試崗位為什么還要學開發。4、優秀的測試人員具備的素質我為什么走測試崗位 一、什么是測試? 其實這個問題說簡單也不簡單,說難…

【C++ 基礎數論】質數判斷

質數判斷 質數:對于所有大于 1 的自然數而言,如果該數除 1 和自身以外沒有其它因數 / 約數,則該數被稱為為質數,質數也叫素數。 如何判定一個數是否為質數呢? 一個簡單的方法是 試除法 : 對于一個數 n&…

6to4、6over4的類比解釋

本文由deepseek生成,特此聲明 1. 6to4:自動的“快遞中轉站” 類比場景: 假設你住在一個偏遠的小鎮(IPv6網絡),周圍被大海(IPv4互聯網)包圍,你想給另一個偏遠小鎮&#…

數字化工廠升級引擎:Modbus TCP轉Profinet網關助力打造柔性生產系統

在當今的工業自動化領域,通信協議扮演著至關重要的角色。Modbus TCP和Profinet是兩種廣泛使用的工業通信協議,它們分別在不同的應用場景中發揮著重要作用。然而,有時我們可能需要將這兩種協議進行轉換,以實現不同設備之間的無縫通…

計算機網絡-MPLS LDP基礎實驗配置

前面我們學習了LDP的會話建立、標簽發布與交換、LDP的工作原理,今天通過一個基礎實驗來加深記憶。 一、LDP基礎實驗 實驗拓撲: 1、IGP使用OSPF進行通告,使用Lookback接口作為LSR ID,LDP ID自動生成。 2、實驗目的:使…

Ocean: Object-aware Anchor-free Tracking

領域:Object tracking It aims to infer the location of an arbitrary target in a video sequence, given only its location in the first frame 問題/現象: Anchor-based Siamese trackers have achieved remarkable advancements in accuracy, yet…

[Java] 方法和數組

目錄 1. 方法 1.2 什么是方法 1.2 方法的定義 1.3 方法的調用 1.4 方法的重載 1.5 遞歸 2. 一維數組 2.1 什么是數組 2.2 數組的創建 2.3 數組的初始化 2.4 遍歷數組 2.5 引用數據類型 2.6 關于null 2.7 數組轉字符串 2.8 數組元素的查找 2.9 數組的排序 2.10…

全局異常處理:如何優雅地統一管理業務異常

在軟件開發中,異常處理是保證系統健壯性的重要環節。一個良好的異常處理機制不僅能提高代碼的可維護性,還能為使用者提供清晰的錯誤反饋。本文將介紹如何通過全局異常處理和業務異常統一處理來編寫更加優雅的代碼。 一、傳統異常處理的痛點 1.1 典型問…

PHP 編程:現代 Web 開發的基石與演進

引言 PHP(Hypertext Preprocessor)自1995年誕生以來,已成為全球最流行的服務器端腳本語言之一。盡管近年來Node.js、Python等語言在特定領域嶄露頭角,但PHP仍占據著超過78%的網站市場份額(W3Techs數據)。本…

MCU程序加密保護(一)閃存讀寫保護法 加密與解密

MCU(微控制器單元)的加密方法可以從硬件、軟件和通信協議三個層面來理解。以下是常見的MCU加密手段,按類型分類說明: 針對目前 STM32 系列微控制器在程序加密保護方面手段單一、保護效果有限的問題,本文介紹并分析了四…

汽車裝配又又又升級,ethernetip轉profinet進階躍遷指南

1. 場景描述:汽車裝配線中,使用EtherNet/IP協議的機器人與使用PROFINET協議的PLC進行數據交互。 2. 連接設備:EtherNet/IP機器人控制器(如ABB、FANUC)與PROFINET PLC(如西門子S7-1500)。 3. 連…

RFID系統:技術解析與應用全景

一、技術架構與運行邏輯 RFID(Radio Frequency Identification)系統通過無線電波實現非接觸式數據交互,其核心由三部分組成: 電子標簽(Tag): 無源標簽:依賴讀寫器電磁場供電&…

25、DeepSeek-R1論文筆記

DeepSeek-R1論文筆記 1、研究背景與核心目標2、核心模型與技術路線3、蒸餾技術與小模型優化4、訓練過程簡介5、COT思維鏈(Chain of Thought)6、強化學習算法(GRPO)7、冷啟動**1. 冷啟動的目的****2. 冷啟動的實現步驟****3. 冷啟動…

開源項目實戰學習之YOLO11:12.2 ultralytics-models-sam-decoders.py源碼分析

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 另外,前些天發現了一個巨牛的AI人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。感興趣的可以點擊相關跳轉鏈接。 點擊跳轉到網站。 ultralytics-models-sam 1.sam-modules-decoders.pyblocks.py: 定義模型中的各…