GPUStack v2.1.1 मल्टी-नोड इन्फरेंस में शुरू न होने की सभी समस्याओं को हल करने की कहानी

GPUStack v2.1.1 मल्टी-नोड इन्फरेंस में शुरू न होने की सभी समस्याओं को हल करने की कहानी

8 min read

Tech Blog
GPUStack
Multi-Node vLLM
Tesla V100
Troubleshooting

GPU क्लस्टर ऑपरेशंस मेमो

GPUStack v2.1.1 मल्टी-नोड इन्फरेंस के शुरू न होने की सभी समस्याओं का समाधान
2-नोड 4×V100 पर Qwen2.5-32B चलाने का पूरा रिकॉर्ड #

GPUStack v2.1.1 + vLLM backend के साथ 2 GPU workers (प्रत्येक में Tesla V100-PCIE-32GB × 2 GPU) पर मल्टी-नोड distributed inference चलाने की कोशिश में हमें एक के बाद एक अलग-अलग समस्याओं का सामना करना पड़ा। Ray cluster के connection failures, Gloo communication errors, /dev/shm की कमी से लेकर V100-specific CUDA kernel errors तक — हम सभी troubles और workarounds को समय-क्रम में दर्ज कर रहे हैं।

GPU-Worker-A: / Tesla V100×2 | GPU-Worker-B: / Tesla V100×2 | GPU-Server: GPUStack Server | GPUStack v2.1.1 / vLLM 0.17.1 / CUDA 12.9

कॉन्फ़िगरेशन का overview #

मैनेजमेंट नोड (GPU-Server) पर GPUStack Server चलता है, और inference 2 GPU workers पर distribute होता है। Models NFS-shared /models में रखे गए हैं। Qwen3.5-35B-A3B (VLM) से शुरू करके, अंत में हमने Qwen2.5-32B-Instruct के साथ स्थिर संचालन की पुष्टि की।

टार्गेट model #

Qwen2.5-32B-Instruct (float16)
tensor-parallel×2 / pipeline-parallel×2

GPU कॉन्फ़िगरेशन #

Tesla V100-PCIE-32GB × 4 GPU
(2 नोड × 2 GPU)
compute capability 7.0

अंतिम परिणाम #

16./s पर स्थिर संचालन
max-model-len: 8192
Workarounds लागू किए गए

समस्याओं और समाधानों का पूरा overview #

समस्या 1

Ray Placement Group अनिश्चित काल तक इंतज़ार करता रहता है #

Model शुरू करने पर Waiting for creating a placement group 10 सेकंड → 30 सेकंड → 150 सेकंड → 630 सेकंड तक लगातार चलता रहता है, और model start नहीं होता।

WARNING: Tensor parallel size (4) exceeds available GPUs (2).
INFO: Waiting for creating a placement group of specs for 630 seconds.
specs=[{'node:': 0.001, 'GPU': 1.0}, {'GPU': 1.0}, {'GPU': 1.0}, {'GPU': 1.0}]

कारण: Ray केवल head नोड की तरफ़ container के अंदर चल रहा है; दूसरे worker नोड के GPU, Ray cluster में join नहीं हो पाते।

वेरिफिकेशन कमांड: vllm runner container के अंदर ray status --address=<HEAD_IP>:41000 चलाएँ।
अगर Ray version mismatch error (2.54.0 vs 2.48.0) दिखे, तो GPUStack image version में अंतर होने का संदेह है।

समस्या 2

/etc/hosts में 127.0.1.1 entry की वजह से Gloo communication फेल #

Ray नोड आपस में connect हो जाते हैं, लेकिन model loading के बाद distributed environment initialization (Gloo का connectFullMesh) फेल हो जाता है।

(RayWorkerWrapper pid=1722) ERROR failed to connect, retry=4, retryLimit=3,
  local=[127.0.0.1]:35509, remote=[127.0.1.1]:51638$1,
  error=SO_ERROR: Connection refused

RuntimeError: Gloo connectFullMesh failed with timed out connecting:
  SO_ERROR: Connection refused, remote=[127.0.1.1]:51638$1

कारण: Ubuntu/Debian का cloud-init डिफ़ॉल्ट रूप से 127.0.1.1 hostname को /etc/hosts में लिख देता है। Gloo इस entry को देखकर नोड के अपने IP को 127.0.1.1 (loopback) मान लेता है, और दूसरे नोड्स से connect करने की कोशिश में refuse हो जाता है।

समाधान: हर नोड पर 127.0.1.1 वाली entry को /etc/hosts में जाकर असली IP address से ठीक करें।

# On GPU-Worker-A
sudo sed -i 's/127.0.1.1\s*GPU-Worker-A/ GPU-Worker-A/' /etc/hosts

# On GPU-Worker-B
sudo sed -i 's/127.0.1.1\s*GPU-Worker-B/ GPU-Worker-B/' /etc/hosts
नोट: इस environment में cloud-init (manage_etc_hosts=True) ने अपने आप असली IP सेट कर दिया था, इसलिए correction की ज़रूरत नहीं पड़ी। Runner container के /etc/hosts में सीधे verify करें कि 127.0.1.1 मौजूद नहीं है।

समस्या 3

Qwen3.5-35B-A3B का Visual Encoder V100 पर काम नहीं करता #

Gloo समस्या हल होने के बाद model loading सफल हो जाती है, लेकिन profile_run फेज़ के दौरान तुरंत crash हो जाता है।

File "vllm/model_executor/layers/conv.py", line 236, in _forward_conv
    x = F.conv3d(
        ^^^^^^^^^
RuntimeError: GET was unable to find an engine to execute this computation

कारण: Qwen3.5-35B-A3B एक Vision Language Model है, और इसके Visual Encoder के Conv3D के लिए V100 (compute capability 7.0) पर compiled cuDNN algorithm मौजूद नहीं है। इसे VLLM_DISABLE_MULTIMODAL=1 जैसे environment variables से bypass नहीं किया जा सकता। चूँकि vLLM profile_run के दौरान हमेशा Visual Encoder initialize करता है, यह एक structural limitation है।

समाधान: Model को Qwen2.5-32B-Instruct (text-only) में बदलें। इसमें Visual Encoder नहीं है, इसलिए यह समस्या नहीं होती।

समस्या 4

Chat के दौरान /dev/shm की कमी से engine crash #

Model start तो हो जाता है, लेकिन chat message भेजते ही engine crash हो जाता है।

WARNING (raylet) store_runner.cc:83: System memory request exceeds memory available in /dev/shm.
  The request is for 10200547328 bytes, and the amount available is 9663676416 bytes.
  If you are inside a Docker container, you may need to pass an argument with the flag '--shm-size'

CUDA error: no kernel image is available for execution on the device

कारण: Docker का डिफ़ॉल्ट /dev/shm साइज़ 64MB होता है। Ray का pipeline_parallel inter-node communication के लिए बड़ी मात्रा में shared memory इस्तेमाल करता है, जो inference के दौरान खत्म हो जाती है। gpustack-worker container को --shm-size specify किए बिना launch किया गया था।

समाधान: gpustack-worker container को --shm-size=16g के साथ restart करें।

docker stop gpustack-worker && docker rm gpustack-worker

docker run -d --name gpustack-worker \
  --restart=unless-stopped \
  --privileged \
  --network=host \
  --shm-size=16g \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /models:/models \
  --volume /var/lib/gpustack-data:/var/lib/gpustack \
  --runtime nvidia \
  gpustack/gpustack:v2.1.1 \
  --server-url http://<SERVER_IP> \
  --token <TOKEN> \
  --cache-dir /models
नोट: GPUStack v2.1.1 का “Mirrored Deployment” फ़ीचर gpustack-worker की settings को runner container तक ले जाता है, लेकिन --shm-size inherit नहीं होता। यह GPUStack-side की समस्या है और इसे नीचे बताए अनुसार environment variables से supplement करना पड़ता है।

समस्या 5

Runner container का shm inherit नहीं होता; RayChannelTimeoutError जारी रहता है #

gpustack-worker को restart करने के बाद भी chat के दौरान engine crash होता रहता है।

ray.exceptions.RayChannelTimeoutError: System error:
  If the execution is expected to take a long time,
  increase RAY_CGRAPH_get_timeout which is currently 300 seconds.
  Otherwise, this may indicate that the execution is hanging.

कारण: vllm/ray runner container को GPUStack हर बार नए सिरे से बनाता है, इसलिए gpustack-worker की --shm-size setting containers के बीच inherit नहीं होती। Runner container का अपना shm 64MB पर ही रहता है।

समाधान: GPUStack UI की model settings में Environment Variables में निम्नलिखित जोड़ें।

RAY_CGRAPH_get_timeout=600
RAY_memory_store_capacity=17179869184

समस्या 6

generation_config का repetition_penalty kernel V100-compatible नहीं; loop में output #

Chat में दोहराए जाने वाले symbols (♡♡♡…) के loop के साथ असामान्य text output आता है। या inference CUDA kernel error के साथ crash हो जाता है।

torch.AcceleratorError: CUDA error: no kernel image is available for execution on the device
# ↑ Occurs during apply_penalties (repetition_penalty) execution

WARNING: Default vLLM sampling parameters have been overridden by the model's
  generation_config.json: {'repetition_penalty': 1.05, 'temperature': 0.7, ...}

कारण: repetition_penalty — जो Qwen2.5 की generation_config.json में सेट है — उसका CUDA kernel V100 के लिए compiled नहीं है।

समाधान: GPUStack UI की model settings → Backend Parameters में जोड़ें:

--generation-config vllm

इससे model की generation_config.json ignore होकर vLLM की डिफ़ॉल्ट settings इस्तेमाल होती हैं।

अंतिम स्थिर संचालन कॉन्फ़िगरेशन का सारांश #

gpustack-worker startup command (दोनों नोड्स के लिए common) #

docker run -d --name gpustack-worker \
  --restart=unless-stopped \
  --privileged \
  --network=host \
  --shm-size=16g \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /models:/models \
  --volume /var/lib/gpustack-data:/var/lib/gpustack \
  --runtime nvidia \
  gpustack/gpustack:v2.1.1 \
  --server-url http://<SERVER_IP> \
  --token <TOKEN> \
  --cache-dir /models

GPUStack UI की model settings #

Backend Parameters:

--tensor-parallel-size 2
--pipeline-parallel-size 2
--distributed-executor-backend ray
--max-model-len 8192
--enforce-eager
--generation-config vllm

Environment Variables:

RAY_CGRAPH_get_timeout=600
RAY_memory_store_capacity=17179869184

ऑपरेशन वेरिफिकेशन के परिणाम #

Qwen2.5-32B-Instruct (float16) 4×Tesla V100-PCIE-32GB (2-नोड कॉन्फ़िगरेशन) पर 16./s की दर से स्थिर चलता है। VRAM उपयोग प्रति GPU 93–96% है। max-model-len है।

V100 (compute capability 7.0) की specific सीमाएँ #

❌ काम नहीं करता #

  • Flash Attention 2 (compute 8.0 या उससे ऊपर ज़रूरी) → Triton ATTN पर fall back होता है
  • bfloat16 (→ अपने आप float16 में convert हो जाता है)
  • Custom AllReduce (NVLink P2P supported नहीं)
  • SymmMemCommunicator
  • VLM Conv3D (Qwen3.5-35B-A3B आदि)
  • generation_config का repetition_penalty kernel

✅ काम करता है #

  • Triton ATTN backend (Flash Attention का विकल्प)
  • NCCL communication (nccl==2.27.5)
  • Ray distributed execution (pipeline + tensor parallel)
  • torch.compile / CUDA Graphs (enforce-eager से disable करने की सलाह)
  • Qwen2.5 जैसे text-only models का inference

ट्रबलशूटिंग checklist #

  • ray status (container के अंदर) से verify करें कि सभी नोड्स के GPU पहचाने गए हैं
  • Verify करें कि हर नोड के /etc/hosts में hostname असली IP पर resolve होता है, 127.0.1.1 पर नहीं
  • gpustack-worker container के लिए --shm-size=16g या उससे बड़ा specify करें
  • Model settings के Environment Variables में RAY_CGRAPH_get_timeout=600 और RAY_memory_store_capacity=17179869184 जोड़ें
  • V100 environments के लिए Backend Parameters में --generation-config vllm जोड़कर generation_config.json को ignore करें
  • VLM (Vision Language Model) V100 पर काम नहीं करता। Text-only models इस्तेमाल करें
  • V100 पर --enforce-eager जोड़ने पर विचार करें (CUDA Graph से जुड़ी instability से बचाता है)
  • अगर VRAM कम पड़ रहा है, तो --gpu-memory-utilization 0.85 से KV cache allocation adjust करें

संदर्भ #

यह लेख एक production environment में troubleshooting का रिकॉर्ड है। IP, tokens और इसी तरह की चीज़ें abstract की गई हैं। कुछ समस्याएँ V100 के अलावा दूसरे GPU environments में नहीं भी हो सकती हैं। vLLM और GPUStack के versions के updates के साथ स्थिति बदल सकती है।

Updated on 2026 वर्ष 6 माह 10 दिन

What are your feelings

  • Happy
  • Normal
  • Sad
目次