用 Ray 跨節點調用 GPU 部署 DeepSeek 大模型,實現分布式高效推理

在大模型時代,單節點 GPU 資源往往難以滿足大模型(如 7B/13B 參數模型)的部署需求。借助 Ray 分布式框架,我們可以輕松實現跨節點 GPU 資源調度,讓大模型在多節點間高效運行。本文將以 DeepSeek-llm-7B-Chat 模型為例,詳細講解如何通過 Ray 搭建跨節點集群,結合 vLLM 實現分布式推理,并解決部署過程中的常見問題。

一、背景與目標

為什么需要跨節點 GPU 調用?

  • 模型規模限制:7B 參數的 DeepSeek 模型單卡可加載,但更大的模型(如 33B)單卡顯存不足,需多卡并行。
  • 資源利用率:跨節點調用可整合多臺服務器的 GPU 資源,避免單節點資源閑置。
  • 分布式推理優勢:通過 Ray 的張量并行(Tensor Parallelism),模型層可拆分到不同節點的 GPU,提升推理效率。

本文目標

  • 搭建包含 1 個主節點、2 個工作節點的 Ray 集群。
  • 跨節點調用 2 張 GPU,用 vLLM 部署 DeepSeek-llm-7B-Chat 模型。
  • 實現 OpenAI 兼容的 API 服務,支持客戶端調用。

二、環境準備

硬件要求

  • 節點數量:3 臺服務器(1 主 2 從,支持 GPU)。
    • 主節點(master):192.168.2.221,至少 1 張 GPU(本文用 Tesla V100-32GB)。
    • 工作節點 1(worker1):192.168.2.226,至少 1 張 GPU。
    • 工作節點 2(worker2):192.168.2.227,至少 1 張 GPU。
  • 網絡:節點間內網互通(推薦 10Gbps 以上帶寬),支持 SSH 免密登錄。

軟件要求

工具 / 庫版本作用
Python3.9運行環境
Ray2.9.0分布式集群管理
vLLM0.9.2高效大模型推理引擎
CUDA11.8GPU 加速
DeepSeek-llm-7B-Chat-目標部署模型

三、詳細部署步驟

步驟 1:全節點初始化環境(所有節點執行)

1.1 安裝系統依賴

解決后續可能出現的Python.h缺失問題(編譯 C 擴展時需要):

# 基于CentOS/RHEL的系統
dnf install -y python3-devel gcc gcc-c++# 基于Ubuntu的系統
# apt-get install -y python3-dev gcc g++
1.2 創建虛擬環境

統一環境避免依賴沖突:

# 安裝virtualenv
pip3 install virtualenv# 創建并激活虛擬環境
cd /opt
virtualenv vllm_env --python=python3.9
source vllm_env/bin/activate  # 激活環境(后續所有操作均在此環境中執行)
1.3 安裝核心依賴
# 安裝Ray(包含集群管理和客戶端組件)
pip install "ray[default,client]" --upgrade# 安裝vLLM(支持分布式推理)
pip install vllm==0.9.2# 安裝其他工具(可選,用于測試)
pip install requests  # 用于發送API請求

步驟 2:搭建 Ray 分布式集群

2.1 啟動主節點(master:192.168.2.221)
# 啟動Ray主節點,指定IP、端口和Dashboard
ray start --head \--node-ip-address 192.168.2.221 \  # 主節點IP--port 6379 \                      # 端口(集群元數據存儲)--dashboard-host 0.0.0.0 \         # 允許外部訪問Dashboard--dashboard-port 8265 \            # Dashboard端口(用于監控集群)--include-dashboard=True \         # 啟用Dashboard

啟動成功后,會顯示工作節點加入命令(需記錄):

To add another node to this Ray cluster, run:ray start --address='192.168.2.221:6379'
2.2 加入工作節點(worker1:192.168.2.226 和 worker2:192.168.2.227)

在兩個工作節點分別執行以下命令,加入主節點集群:

# 激活虛擬環境(同主節點路徑)
source /opt/vllm_env/bin/activate# 加入集群(使用主節點輸出的地址)
ray start \--address '192.168.2.221:6379' \  # 主節點地址--node-ip-address 192.168.2.226   # 當前工作節點IP(worker1填226,worker2填227)
2.3 驗證集群狀態(主節點執行)
# 查看集群節點信息
ray status

預期輸出(顯示 3 個節點,2 張 GPU 可用):

Node status
---------------------------------------------------------------
Healthy:1 node_abc... (192.168.2.221)1 node_def... (192.168.2.226)1 node_ghi... (192.168.2.227)
Resources
---------------------------------------------------------------
Total Usage: 0.0/192.0 CPU, 0.0/2.0 GPU  # 2張GPU可用

步驟 3:部署 DeepSeek 模型(主節點執行)

3.1 準備模型

將 DeepSeek-llm-7B-Chat 模型下載到所有節點均可訪問的路徑(推薦用 NFS 共享,避免多節點重復下載):

# 示例:通過Hugging Face Hub下載(需提前登錄hf-cli)
huggingface-cli download deepseek-ai/deepseek-llm-7b-chat --local-dir /data/storage/data/VLLM_MODE/deepseek-llm-7b-chat
3.2 啟動 vLLM 服務(支持跨節點 GPU 調用)
# 激活虛擬環境
source /opt/vllm_env/bin/activate# 設置Ray集群地址
export RAY_ADDRESS="192.168.2.221:6379"# 啟動OpenAI兼容的API服務
python -m vllm.entrypoints.openai.api_server \--model /data/storage/data/VLLM_MODE/deepseek-llm-7b-chat \  # 模型路徑--port 9001 \                                              # API服務端口--host 0.0.0.0 \                                           # 允許外部訪問--tensor-parallel-size 2 \                                 # 張量并行數(=總GPU數)--distributed-executor-backend ray \                       # 使用Ray作為分布式后端--gpu-memory-utilization 0.9                               # GPU內存利用率(90%)

啟動成功的關鍵日志:

步驟 4:驗證跨節點 GPU 調用

4.1 檢查 GPU 使用情況(工作節點執行)

在 worker1(192.168.2.226)和 worker2(192.168.2.227)分別執行nvidia-smi,可看到 GPU 被 vLLM 進程占用:

nvidia-smi

預期輸出(關鍵信息):

+-----------------------------------------------------------------------------+
| Processes:                                                                    |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=============================================================================|
|    0   N/A  N/A    872773      C   ...vllm_env/bin/python                   28511MiB |  # vLLM進程占用
+-----------------------------------------------------------------------------+

說明兩個節點的 GPU 均被成功調用(每張卡負載約 28GB,符合 7B 模型 + 90% 內存利用率的預期)。

4.2 測試模型推理(客戶端執行)

通過 API 發送請求測試:

# 發送推理請求
curl http://192.168.2.221:9001/v1/chat/completions \-H "Content-Type: application/json" \-d '{"model": "deepseek-llm-7b-chat","messages": [{"role": "user", "content": "介紹一下Ray和vLLM的關系"}]}'

成功響應示例(部分):

json

{"id": "chatcmpl-xxx","object": "chat.completion","created": 1689523456,"model": "deepseek-llm-7b-chat","choices": [{"message": {"role": "assistant","content": "Ray是一個分布式計算框架,可用于管理跨節點的GPU資源...vLLM是高效的大模型推理引擎,通過Ray實現分布式部署..."},"finish_reason": "stop","index": 0}]
}

步驟 5:Ray 集群的停止與清理

當需要更新配置或重啟集群時,需徹底停止 Ray 進程并清理殘留數據,避免舊會話信息干擾:

# 停止當前節點的 Ray 進程
ray stop# 若 ray stop 無效,直接 kill 殘留進程(謹慎使用,確保只 kill Ray 相關進程)
pkill -f ray# 清理 Ray 臨時目錄(包含Redis數據、會話信息等)
rm -rf /tmp/ray/*

注意:以上命令需在所有節點執行(主節點 + 工作節點),確保集群完全停止。清理完成后,可重新執行步驟 2 和步驟 3 啟動新集群。

四、常見問題與解決方案

問題 1:Python.h: No such file or directory

  • 原因:缺少 Python 開發庫,編譯 C 擴展時失敗。
  • 解決:安裝python3-devel
    dnf install python3-devel  # CentOS/RHEL
    # 或 apt-get install python3-dev  # Ubuntu
    

問題 2:ModuleNotFoundError: No module named 'vllm'

  • 原因:工作節點未安裝 vLLM。
  • 解決:在所有工作節點的虛擬環境中安裝 vLLM:
    source /opt/vllm_env/bin/activate
    pip install vllm==0.9.2
    

問題 3:Ray Client 連接超時

  • 原因:6379 端口未開放或 Ray Client 服務未啟動。
  • 解決
    # 主節點開放端口
    firewall-cmd --add-port=6379/tcp --permanent
    firewall-cmd --reload# 重啟Ray時顯式指定Client端口
    ray start --head ... --ray-client-server-port 6379
    

問題 4:GPU 資源不足

  • 原因tensor-parallel-size超過實際 GPU 數量。
  • 解決:確保--tensor-parallel-size等于集群總 GPU 數(本文為 2)。
關鍵代碼
pip install "ray[default]" --upgrade
ray start --head   --node-ip-address 192.168.2.221   --port 6379   --dashboard-host 0.0.0.0    --dashboard-port 8265   --include-dashboard=True  創建master ray主節點
ray start   --address '192.168.2.221:6379'   --node-ip-address 192.168.2.226 
ray start   --address '192.168.2.221:6379'   --node-ip-address 192.168.2.227cd /opt/
source vllm_env/bin/activateexport HF_ENDPOINT=https://hf-mirror.com 
huggingface-cli download --resume-download deepseek-ai/deepseek-llm-7b-chat --local-dir /data/storage/data/VLLM_MODE/deepseek-llm-7b-chatRAY_ADDRESS="192.168.2.221:6379" python -m vllm.entrypoints.openai.api_server   --model /data/storage/data/VLLM_MODE/deepseek-llm-7b-chat   --port 9001 --host 0.0.0.0    --tensor-parallel-size 2   --distributed-executor-backend ray  --gpu-memory-utilization 0.9

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

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

相關文章

快速了解 HTTPS

1. 引入 在 HTTP 協議 章節的 reference 段,曾提到過 HTTPS。這里對HTTPS進行詳細介紹。 HTTPS 是在 HTTP 的基礎上,引入了一個加密層 (SSL)。HTTP 是明文傳輸的 (不安全)。當下所見到的大部分網站都是 HTTPS 的。 起初是拜運營商劫持所賜(…

mysql備份與視圖

要求:1.將mydb9_stusys數據庫下的student、sc 和course表,備份到本地主機保存為st_msg_bak.sql文件,然后將數據表恢復到自建的db_test數據庫中;2.在db_test數據庫創建一視圖 stu_info,查詢全體學生的姓名,性別,課程名&…

【數據結構】 鏈表 + 手動實現單鏈表和雙鏈表的接口(圖文并茂附完整源碼)

文章目錄 一、 鏈表的概念及結構 二、鏈表的分類 ?編輯 三、手動實現單鏈表 1、定義單鏈表的一個節點 2、打印單鏈表 3、創建新節點 4、單鏈表的尾插 5、單鏈表的頭插 6、單鏈表的尾刪 7、單鏈表的頭刪 8、單鏈表的查找 9、在指定位置之前插入一個新節點 10、在指…

Go語言時間控制:定時器技術詳細指南

1. 定時器基礎:從 time.Sleep 到 time.Timer 的進化為什么 time.Sleep 不夠好?在 Go 編程中,很多人初學時會用 time.Sleep 來實現時間控制。比如,想讓程序暫停 2 秒,代碼可能是這樣:package mainimport (&q…

C# 轉換(顯式轉換和強制轉換)

顯式轉換和強制轉換 如果要把短類型轉換為長類型,讓長類型保存短類型的所有位很簡單。然而,在其他情況下, 目標類型也許無法在不損失數據的情況下容納源值。 例如,假設我們希望把ushort值轉化為byte。 ushort可以保存任何0~65535的…

淺談自動化設計最常用的三款軟件catia,eplan,autocad

筆者從上半年開始接觸這三款軟件,掌握了基礎用法,但是過了一段時間不用,發現再次用,遇到的問題短時間解決不了,忘記的有點多,這里記錄一下,防止下次忘記Elpan:問題1QF01是柜安裝板上的一個部件&…

網絡編程7.17

練習&#xff1a;服務器&#xff1a;#include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &…

c++ 模板元編程

聽說模板元編程能在編譯時計算出常量&#xff0c;簡單測試下看看&#xff1a;template<int N> struct Summation {static constexpr int value N Summation<N - 1>::value; // 計算 1 2 ... N 的值 };template<> struct Summation<1> { // 遞歸終…

【深度學習】神經網絡過擬合與欠擬合-part5

八、過擬合與欠擬合訓練深層神經網絡時&#xff0c;由于模型參數較多&#xff0c;數據不足的時候容易過擬合&#xff0c;正則化技術就是防止過擬合&#xff0c;提升模型的泛化能力和魯棒性 &#xff08;對新數據表現良好 對異常數據表現良好&#xff09;1、概念1.1過擬合在訓練…

JavaScript的“硬件窺探術”:瀏覽器如何讀取你的設備信息?

JavaScript的“硬件窺探術”&#xff1a;瀏覽器如何讀取你的設備信息&#xff1f; 在Web開發的世界里&#xff0c;JavaScript一直扮演著“幕后魔術師”的角色。從簡單的頁面跳轉到復雜的實時數據處理&#xff0c;它似乎總能用最輕巧的方式解決最棘手的問題。但你是否想過&#…

論安全架構設計(層次)

安全架構設計&#xff08;層次&#xff09; 摘要 2021年4月&#xff0c;我有幸參與了某保險公司的“優車險”項目的建設開發工作&#xff0c;該系統以車險報價、車險投保和報案理賠為核心功能&#xff0c;同時實現了年檢代辦、道路救援、一鍵挪車等增值服務功能。在本項目中&a…

滾珠導軌常見的故障有哪些?

在自動化生產設備、精密機床等領域&#xff0c;滾珠導軌就像是設備平穩運行的 “軌道”&#xff0c;為機械部件的直線運動提供穩準導向。但導軌使用時間長了&#xff0c;難免會出現這樣那樣的故障。滾珠脫落&#xff1a;可能由安裝不當、導軌損壞、超負荷運行、維護不當或惡劣環…

機器視覺的包裝盒絲印應用

在包裝盒絲網印刷領域&#xff0c;隨著消費市場對產品外觀精細化要求的持續提升&#xff0c;傳統印刷工藝面臨多重挑戰&#xff1a;多色套印偏差、曲面基材定位困難、異形結構印刷失真等問題。雙翌光電科技研發的WiseAlign視覺系統&#xff0c;通過高精度視覺對位技術與智能化操…

Redis學習-03重要文件及作用、Redis 命令行客戶端

Redis 重要文件及作用 啟動/停止命令或腳本 /usr/bin/redis-check-aof -> /usr/bin/redis-server /usr/bin/redis-check-rdb -> /usr/bin/redis-server /usr/bin/redis-cli /usr/bin/redis-sentinel -> /usr/bin/redis-server /usr/bin/redis-server /usr/libexec/red…

SVN客戶端(TortoiseSVN)和SVN-VS2022插件(visualsvn)官網下載

SVN服務端官網下載地址&#xff1a;https://sourceforge.net/projects/win32svn/ SVN客戶端工具(TortoiseSVN):https://plan.io/tortoise-svn/ SVN-VS2022插件(visualsvn)官網下載地址&#xff1a;https://www.visualsvn.com/downloads/

990. 等式方程的可滿足性

題目&#xff1a;第一次思考&#xff1a; 經典并查集 實現&#xff1a;class UnionSet{public:vector<int> parent;public:UnionSet(int n) {parent.resize(n);}void init(int n) {for (int i 0; i < n; i) {parent[i] i;}}int find(int x) {if (parent[x] ! x) {pa…

HTML--教程

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body><h1>我的第一個標題</h1><p>我的第一個段落。</p> </body> </html&g…

Leetcode刷題營第二十七題:二叉樹的最大深度

104. 二叉樹的最大深度 給定一個二叉樹 root &#xff0c;返回其最大深度。 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;3示例 2&#xff1a; 輸入&#xff…

微信小程序翻書效果

微信小程序翻書效果 wxml <viewwx:for"{{imgList}}" hidden"{{pagenum > imgList.length - index - 1}}"wx:key"index"class"list-pape" style"{{index imgList.length - pagenum - 1 ? clipPath1 : }}"bindtouchst…