iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

前言

接續昨天的監控介紹和 Day24 的實作篇,今天就要來介紹如何使用開源工具Prometheus和Grafana來監控vLLM的一些硬體與推理指標,最後實作一個非常基礎的dashboard 📊。

因為這篇也是一堆圖,所以先放大綱。

🔍 章節大綱

  • vLLM Production Metrics 介紹 📘
  • Docker Compose 安裝 Prometheus 和 Grafana 🐳
  • 串接 + 拉 dashboard 📊
  • vLLM logs 介紹 📖

⚠️ 注意:因為筆者在infra時期只懂皮毛,所以這篇的方法基本上都是GPT-4o老師教的,僅供參考

https://ithelp.ithome.com.tw/upload/images/20240930/20168115lYtE37GA8i.jpg
(圖源: Medium,雖然dashboard看起來很漂亮,但後面的pipeline也是很重要的)


📘 vLLM Production Metrics

官方文件有提供一個監控的方法,在OpenAI compatible API server的/metrics endpoint,其中監控指標vLLM用英文都取名得很白話,但同時也歡迎參考 Day4

假設你開了一個vLLM服務在http://localhost:8000/,這時如果curl http://localhost:8000/metrics會發現有很多這種格式的回應:

# HELP vllm:num_requests_running Number of requests currently running on GPU.
# TYPE vllm:num_requests_running gauge
vllm:num_requests_running{model_name="yentinglin/Llama-3-Taiwan-8B-Instruct-128k"} 0.0

這種資料格式是「Exposition formats」,是prometheus的資料格式。

  • # HELP是一個可選的說明行,用來解釋這個metric的作用。
  • # TYPE用來指定這個metric的類型。Prometheus中常見的metric類型包含:
    • counter:遞增計數器,表示累積的資料(例如請求的總數)。
    • gauge:可增減的資料,表示當前的狀態或數值(例如資源使用率、當前的請求數量)。
    • histogram 和 summary:用於測量資料分佈的metric。
  • vllm:num_requests_running是這個metric的名稱。
  • {model_name="yentinglin/Llama-3-Taiwan-8B-Instruct-128k"}是這個metric的label。
    • Label是用來區分不同情況下的metric的值的。
    • 這裡的label是model_name,它的值是yentinglin/Llama-3-Taiwan-8B-Instruct-128k。
    • 如果有多個模型,就可以針對model_name選擇要看哪一個模型的資料。
  • 0.0是這個metric當前的值,表示在這個模型上請求數量是0。

⚠️ 其他詳細介紹和使用方式請深入研究Prometheus和PromQL
https://ithelp.ithome.com.tw/upload/images/20240930/20168115Cs40SJdURl.png


🐳 Docker Compose安裝Prometheus和Grafana

  1. 先創個資料夾來放yaml檔。
mkdir prometheus-grafana 
cd prometheus-grafana
  1. 接下來建立prometheus.ymldocker-compose.yml兩個文件。

prometheus.yml

global:
  scrape_interval: 15s  # Prometheus每15秒拉取一次資料

scrape_configs:
  - job_name: 'custom-metrics'  # 任務名稱,可以自定義
    static_configs:
      - targets: ['特定IP:8000']  # 這裡填寫你要監控的metrics地址,例如'127.0.0.1:8000',不用加上/metrics

docker-compose.yml

version: '3.7'

services:
  prometheus:
    image: prom/prometheus:latest  # 用最新版本的Prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml  # 把本地的prometheus.yml映射到容器內
    ports:
      - "9090:9090"  # 把容器內的9090 port映射到電腦
    restart: unless-stopped  # 如果服務出問題自動重啟

  grafana:
    image: grafana/grafana:latest  # 用最新版本的Grafana
    container_name: grafana
    ports:
      - "3000:3000"  # 把容器內的3000 port映射到電腦,這是Grafana的Web介面
    restart: unless-stopped
  1. 啟動Docker Compose
docker-compose up -d

可以看到prometheus和grafana的ID都有成功建立docker了。
https://ithelp.ithome.com.tw/upload/images/20240930/20168115R4hE1V9W8m.png


📊 都串接起來 + 拉 dashboard

打開Grafana http://localhost:3000 ,預設帳密是admin@admin,第一次登入會需要改密碼。

https://ithelp.ithome.com.tw/upload/images/20240930/20168115TwJ2jXLMYa.jpg

登入之後找到Connection > Data sources > Add new data source
選擇prometheus,之後把prometheus的URL http://localhost:9090/填上去,最下面Save & test。
https://ithelp.ithome.com.tw/upload/images/20240930/201681159Nvrj5sR7Q.jpg

https://ithelp.ithome.com.tw/upload/images/20240930/20168115YF3Ocpfdtz.jpg

再來就可以直接建立dashboard了。

⚠️ 再度提醒,筆者是超級Grafana菜鳥,這邊請參考專門撰寫Grafana的系列來拉dashboard。

稍微介紹一下欄位。
https://ithelp.ithome.com.tw/upload/images/20240930/20168115DAeoyv4GAr.png

下圖是筆者隨便拉的,很醜請見諒QQ

右邊的request_success_total會因為finished_reason區分成不同的累加,這些都可以透過PromQL去做顯示上的調整,顯示上顏色的調整就看個人。
https://ithelp.ithome.com.tw/upload/images/20240930/20168115d6TwkA7vRy.png

建立dashboard時下面的值不知道要填啥,可以從Explore > Metrics去看。
截圖的時候因為才剛開起來,還沒有vLLM的request,所以除了counter之外的metric都是no data。
https://ithelp.ithome.com.tw/upload/images/20240930/20168115bcMAIFCeHh.jpg

筆者這邊用postman Runner瘋狂打5分鐘就有很多資料了!
https://ithelp.ithome.com.tw/upload/images/20240930/201681150Cw5vTG1ZI.jpg

🐞 如果一直都沒有資料,想要debug確定你的prometheus有沒有問題:
可以先下docker logs prometheus檢查有沒有問題。
如果還是找不到,可以去http://localhost:9090/介面看看State有沒有DOWN。

筆者之前腦霧忘記自己改了vLLM的port,但prometheus沒改就直接DOWN沒資料了,還花了一堆時間找原因ಥ_ಥ。


📖 vLLM logs

官方文件同時也有提供一個vLLM logs放置的位置,這邊以官方給的例子來介紹:

tail ~/.config/vllm/usage_stats.json

{
  "uuid": "fbe880e9-084d-4cab-a395-8984c50f1109",
  "provider": "GCP",
  "num_cpu": 24,
  "cpu_type": "Intel(R) Xeon(R) CPU @ 2.20GHz",
  "cpu_family_model_stepping": "6,85,7",
  "total_memory": 101261135872,
  "architecture": "x86_64",
  "platform": "Linux-5.10.0-28-cloud-amd64-x86_64-with-glibc2.31",
  "gpu_count": 2,
  "gpu_type": "NVIDIA L4",
  "gpu_memory_per_device": 23580639232,
  "model_architecture": "OPTForCausalLM",
  "vllm_version": "0.3.2+cu123",
  "context": "LLM_CLASS",
  "log_time": 1711663373492490000,
  "source": "production",
  "dtype": "torch.float16",
  "tensor_parallel_size": 1,
  "block_size": 16,
  "gpu_memory_utilization": 0.9,
  "quantization": null,
  "kv_cache_dtype": "auto",
  "enable_lora": false,
  "enable_prefix_caching": false,
  "enforce_eager": false,
  "disable_custom_all_reduce": true
}

而這些資料也可以整合進ELK Stack當中,再依照需求去做更進階的分析。同樣地,如果想學這些設定,請再去閱讀相關的系列XDD

  • 也許留著這些會有企業感到不舒服,因此官方也有提供不要存這些資料的方法。
    • 設置環境變量 VLLM_NO_USAGE_STATS=1DO_NOT_TRACK=1
    • 或是建立一個文件 ~/.config/vllm/do_not_track 來禁止資料收集。

延伸閱讀

10/8補充:後來從這個discussions發現vLLM官方dashboard藏在這裡!!
直接下載grafana.json再import到grafana上就可以用啦,連一分鐘都不用就設定好了,好快好潮!
https://ithelp.ithome.com.tw/upload/images/20241008/20168115GBUe98HjmL.jpg

其他也有別人做的,用InfluxDB抓GPU相關資料的dashboard,看起來也滿不錯的,但自己拉也是很好玩,拉了一個禮拜後終於找回手感了(???)


章節總結

這一章簡單介紹了實作步驟,學習如何從零開始,利用使用Prometheus和Grafana來簡單建立一個極為基礎的LLM監控系統。但在實踐中,無論是配置Prometheus 🧩、撰寫有用的PromQL查詢 🧑‍🔬,還是設計自定義的dashboard 🛸,都需要深入的學習和持續的實踐。

技術領域沒有捷徑 🚧,尤其是這些名稱就可以成為一本書籍的技術,更是要腳踏實地學習,學習和應用過程中不可避免地會發現自己的不足,這也是不斷進步的契機 🔄。

對於有興趣進一步探索LLMOps監控的讀者,這是一個充滿挑戰與回報的領域 💡,歡迎您一同踏入這個技術的大坑 🕳️,並期待未來持續的成長與學習 📈!

https://ithelp.ithome.com.tw/upload/images/20240930/20168115Q1WYGuPSWD.jpg
(圖源: 梗圖倉庫請把摺紙換成拉dashboard)

OK,以上是GPT-4o用文言文修過的總結,筆者真正的OS是......雖然要架起來是超快的也沒啥問題,但拉那個dashboard超難拉啊啊啊,拉了整天還是拉不出什麼可以看的內容,早知道以前認真一點冒著被嘴的風險多問學長們一些厚臉皮問題了啦RRRR

如果這系列29天以來覺得有一些收穫,也歡迎來閱讀明天的聊天總結篇章!!

https://ithelp.ithome.com.tw/upload/images/20240930/20168115cQ7gld6e6E.jpg
(圖源: 自製,就......一點點而已)


上一篇
Day28 - 從服務部署到維運:DevOps & 服務監控
下一篇
Day30 - 尾聲 & 未來展望:LLM畫大餅之旅心得
系列文
Local LLM infra & Inference 一部曲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言