ਦੋ DGX Spark-ਕਲਾਸ ਬਕਸੇ, ਇੱਕ ਮਾਡਲ: ਹਰੇਕ 'ਤੇ ਇੱਕ ਕਾਪੀ, ਵੰਡ ਨੂੰ ਹਰਾਉਂਦੀ ਹੋਈ

Ops

ਸੱਤ ਹਫ਼ਤਿਆਂ ਤੱਕ ਸਾਡਾ ਲੋਕਲ ਭਾਸ਼ਾ ਮਾਡਲ ਦੋ NVIDIA GB10 ਮਸ਼ੀਨਾਂ ਵਿੱਚ ਟੈਂਸਰ ਪੈਰਲਲਿਜ਼ਮ ਨਾਲ ਵੰਡਿਆ ਹੋਇਆ ਚੱਲਿਆ। 22 ਅਕਤੂਬਰ ਨੂੰ ਅਸੀਂ ਉਸਦੀ ਥਾਂ ਹਰੇਕ ਮਸ਼ੀਨ 'ਤੇ ਮਾਡਲ ਦੀ ਪੂਰੀ ਕਾਪੀ ਅਤੇ ਅੱਗੇ ਇੱਕ ਲੀਸਟ-ਕਨੈਕਸ਼ਨ ਪ੍ਰਾਕਸੀ ਨਾਲ ਬਦਲ ਦਿੱਤਾ। ਥ੍ਰੂਪੁੱਟ ਲਗਭਗ 180 ਤੋਂ ਵਧ ਕੇ 210 ਟੋਕਨ ਪ੍ਰਤੀ ਸਕਿੰਟ ਹੋ ਗਈ, ਅਤੇ ਹੁਣ ਹਰੇਕ ਮਸ਼ੀਨ ਬਿਨਾਂ ਮਾਡਲ ਬੰਦ ਕੀਤੇ ਰੀਸਟਾਰਟ ਹੋ ਸਕਦੀ ਹੈ।

ਅਸੀਂ ਇਸਨੂੰ ਕਿਉਂ ਵੰਡਿਆ ਸੀ

ਹਰੇਕ ਮਸ਼ੀਨ ਵਿੱਚ 128 GB ਮੈਮੋਰੀ ਹੈ ਜੋ CPU ਅਤੇ GPU ਸਾਂਝੀ ਕਰਦੇ ਹਨ। ਸਤੰਬਰ ਵਿੱਚ ਮਾਡਲ ਇੱਕ ਮਸ਼ੀਨ 'ਤੇ ਫਿੱਟ ਹੋ ਗਿਆ, ਪਰ ਉਸਦਾ ਕੈਸ਼ ਮੁਸ਼ਕਲ ਨਾਲ ਫਿੱਟ ਹੋਇਆ: ਅਸੀਂ ਜੋ vLLM ਬਿਲਡ ਵਰਤਿਆ ਸੀ, ਉਹ ਇਸ ਮਾਡਲ ਦੇ KV ਕੈਸ਼ ਨੂੰ FP8 ਵਿੱਚ ਨਹੀਂ ਰੱਖ ਸਕਦਾ ਸੀ, ਇਸਲਈ ਕੈਸ਼ BF16 ਵਿੱਚ ਸੀ, ਅਤੇ ਇੱਕ ਮਸ਼ੀਨ ਵਿੱਚ 499,110 ਟੋਕਨਾਂ ਲਈ ਥਾਂ ਸੀ। ਮਾਡਲ ਦੇ ਪੂਰੇ ਕੰਟੈਕਸਟ 262,144 ਟੋਕਨਾਂ ਨਾਲ ਇਹ ਦੋ ਰਿਕਵੈਸਟਾਂ ਤੋਂ ਵੀ ਘੱਟ ਹੈ। ਉਹਨਾਂ ਦੇ ਸਿੱਧੇ ਨੈੱਟਵਰਕ ਲਿੰਕ 'ਤੇ ਟੈਂਸਰ ਪੈਰਲਲਿਜ਼ਮ ਨਾਲ ਦੋਵੇਂ ਮਸ਼ੀਨਾਂ ਵਿੱਚ ਵੰਡਣ 'ਤੇ, ਕੈਸ਼ ਤਿੰਨ ਮਿਲੀਅਨ ਤੋਂ ਵੱਧ ਟੋਕਨਾਂ ਤੱਕ ਵਧ ਗਿਆ। ਅਸੀਂ ਮਾਡਲ ਨੂੰ ਗਤੀ ਲਈ ਨਹੀਂ, ਬਲਕਿ ਥਾਂ ਲਈ ਵੰਡਿਆ ਸੀ।

ਕੀ ਬਦਲਿਆ

ਇਸੇ ਮਾਡਲ ਦਾ ਇੱਕ ਨਵਾਂ 4-ਬਿੱਟ ਬਿਲਡ (NVFP4, ਕੁਆਂਟਾਈਜ਼ੇਸ਼ਨ-ਅਵੇਅਰ ਡਿਸਟਿਲੇਸ਼ਨ ਨਾਲ ਬਣਿਆ) ਲਗਭਗ 71 GiB ਮੈਮੋਰੀ ਲੈਂਦਾ ਹੈ, ਅਤੇ GB10 ਲਈ ਇੱਕ ਕਮਿਊਨਿਟੀ vLLM ਬਿਲਡ (eugr/spark-vllm-b12x) ਉਸਦੇ ਕੈਸ਼ ਨੂੰ FP8 ਵਿੱਚ ਚਲਾਉਂਦਾ ਹੈ। ਹੁਣ ਇੱਕ ਮਸ਼ੀਨ ਪੂਰਾ ਮਾਡਲ ਅਤੇ 0.76 ਤੋਂ 1.08 ਮਿਲੀਅਨ ਟੋਕਨਾਂ ਦਾ ਕੈਸ਼ ਸੰਭਾਲਦੀ ਹੈ, ਜੋ ਪੂਰੇ ਕੰਟੈਕਸਟ 'ਤੇ 2.9 ਤੋਂ 4.1 ਰਿਕਵੈਸਟਾਂ ਲਈ ਥਾਂ ਹੈ, ਇਹ ਨਿਰਭਰ ਕਰਦਾ ਹੈ ਕਿ ਮਸ਼ੀਨ ਕਿੰਨੀ ਮੈਮੋਰੀ ਦਿੰਦੀ ਹੈ। ਦੋਵੇਂ ਕਾਪੀਆਂ ਮਾਡਲ ਦੀ ਆਪਣੀ ਸਪੈਕੂਲੇਟਿਵ ਡੀਕੋਡਿੰਗ (MTP, ਚਾਰ ਡ੍ਰਾਫਟ ਟੋਕਨ) ਵਰਤਦੀਆਂ ਹਨ। ਬਦਲਣ ਤੋਂ ਪਹਿਲਾਂ ਅਸੀਂ ਨਵੇਂ ਬਿਲਡ 'ਤੇ ਆਪਣਾ ਟੂਲ-ਕਾਲਿੰਗ ਟੈਸਟ ਚਲਾਇਆ: ਇਸਨੇ 86 ਸਕੋਰ ਕੀਤਾ, ਜਦਕਿ ਜਿਸ ਬਿਲਡ ਨੂੰ ਇਸਨੇ ਬਦਲਿਆ ਸੀ, ਉਸਨੇ 75 ਸਕੋਰ ਕੀਤਾ ਸੀ।

ਅਸੀਂ ਕੀ ਮਾਪਿਆ

ਦੋ ਮਸ਼ੀਨਾਂ ਵਿੱਚ ਵੰਡਿਆਹਰੇਕ ਮਸ਼ੀਨ 'ਤੇ ਇੱਕ ਕਾਪੀ
KV ਕੈਸ਼3 ਮਿਲੀਅਨ ਤੋਂ ਵੱਧ ਟੋਕਨ0.76 ਅਤੇ 1.08 ਮਿਲੀਅਨ ਟੋਕਨ
ਪੂਰੇ ਕੰਟੈਕਸਟ 'ਤੇ ਰਿਕਵੈਸਟਲਗਭਗ 122.9 ਅਤੇ 4.1
ਸਾਡੇ ਲੋਡ ਹੇਠ ਥ੍ਰੂਪੁੱਟਲਗਭਗ 180 ਟੋਕਨ/ਸਕਿੰਟ210 ਟੋਕਨ/ਸਕਿੰਟ (111 + 99)
ਸ਼ੁਰੂਆਤਲਗਭਗ 20 ਮਿੰਟਹਰੇਕ ਕਾਪੀ ਲਈ 5 ਤੋਂ 13 ਮਿੰਟ
ਇੱਕ ਮਸ਼ੀਨ ਰੀਸਟਾਰਟ ਹੁੰਦੀ ਹੈਮਾਡਲ ਡਾਊਨ ਹੋ ਜਾਂਦਾ ਹੈਦੂਜੀ ਕਾਪੀ ਸੇਵਾ ਦਿੰਦੀ ਹੈ

ਇੱਕ ਕਾਪੀ ਆਪਣੇ ਆਪ ਵਿੱਚ, ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਸੰਭਾਲੇ ਗਏ ਅਨੁਰੋਧਾਂ ਦੀ ਗਿਣਤੀ ਅਨੁਸਾਰ: ਛੋਟੇ ਪ੍ਰੌਂਪਟਾਂ ਨਾਲ, 1 ਅਨੁਰੋਧ ਨੇ 36 ਟੋਕਨ ਪ੍ਰਤੀ ਸਕਿੰਟ ਦਿੱਤੇ, 4 ਨੇ 82, 8 ਨੇ 109 ਅਤੇ 16 ਨੇ 150। ਸਾਡੇ ਈਮੇਲ ਏਜੰਟ ਦੇ ਵੱਡੇ ਪ੍ਰੌਂਪਟਾਂ ਨਾਲ, 4 ਨੇ 81, 8 ਨੇ 113 ਅਤੇ 16 ਨੇ ਸਿਰਫ਼ 87 ਦਿੱਤੇ: ਅੱਠ ਅਨੁਰੋਧਾਂ ਤੋਂ ਵੱਧ ਹੋਣ 'ਤੇ, ਹੋਰ ਅਨੁਰੋਧ ਇਸਨੂੰ ਹੌਲੀ ਕਰ ਦਿੰਦੇ ਹਨ।

ਇੱਕ ਦੁਪਹਿਰ ਲਈ, ਇੱਕ ਕਾਪੀ ਨੇ ਵੱਧ ਤੋਂ ਵੱਧ 12 ਅਨੁਰੋਧ ਇੱਕ ਸਮੇਂ ਲਏ ਅਤੇ ਦੂਜੀ ਨੇ 8। ਪਹਿਲੀ ਨੇ 91 ਤੋਂ 93 ਟੋਕਨ ਪ੍ਰਤੀ ਸਕਿੰਟ ਪੈਦਾ ਕੀਤੇ ਅਤੇ ਪ੍ਰਤੀ ਮਿੰਟ 26 ਤੋਂ 27 ਅਨੁਰੋਧ ਪੂਰੇ ਕੀਤੇ; ਦੂਜੀ ਨੇ 81 ਤੋਂ 83 ਟੋਕਨ ਪ੍ਰਤੀ ਸਕਿੰਟ ਅਤੇ ਪ੍ਰਤੀ ਮਿੰਟ 22 ਅਨੁਰੋਧ ਪੂਰੇ ਕੀਤੇ। ਹੁਣ ਦੋਵੇਂ 12 ਲੈਂਦੀਆਂ ਹਨ।

ਅਸੀਂ ਕੀ ਛੱਡਿਆ

ਥਾਂ। ਸਪਲਿਟ ਮਾਡਲ ਕੋਲ ਤਿੰਨ ਮਿਲੀਅਨ ਤੋਂ ਵੱਧ ਟੋਕਨਾਂ ਦਾ ਇੱਕ ਕੈਸ਼ ਸੀ; ਕਾਪੀਆਂ ਕੋਲ ਦੋ ਛੋਟੇ ਕੈਸ਼ ਹਨ, ਅਤੇ ਇੱਕ ਅਨੁਰੋਧ ਸਿਰਫ਼ ਉਸ ਕਾਪੀ ਦੇ ਕੈਸ਼ ਨੂੰ ਵਰਤ ਸਕਦਾ ਹੈ ਜੋ ਉਸਨੂੰ ਸੰਭਾਲਦੀ ਹੈ। ਸਾਡੇ ਏਜੰਟ ਬਹੁਤ ਸਾਰੇ ਛੋਟੇ ਅਤੇ ਦਰਮਿਆਨੇ ਅਨੁਰੋਧ ਭੇਜਦੇ ਹਨ, ਅਤੇ ਉਹਨਾਂ ਲਈ ਥਰੂਪੁੱਟ ਵਧੇਰੇ ਮਹੱਤਵਪੂਰਨ ਸੀ। ਜੇਕਰ ਤੁਸੀਂ ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਕੁਝ ਬਹੁਤ ਵੱਡੇ ਕੰਟੈਕਸਟ ਸੰਭਾਲਦੇ ਹੋ, ਤਾਂ ਸਪਲਿਟਿੰਗ ਫਿਰ ਵੀ ਬਿਹਤਰ ਚੋਣ ਹੋ ਸਕਦੀ ਹੈ। ਅਸੀਂ ਸਪਲਿਟ ਸੈਟਅਪ ਰੱਖਿਆ, ਅਤੇ ਵਾਪਸ ਬਦਲਣਾ ਇੱਕ ਸਕ੍ਰਿਪਟ ਹੈ।

ਬਦਲਾਅ ਦੌਰਾਨ ਕੀ ਗਲਤ ਹੋਇਆ

  1. ਇੱਕ ਮਾਡਲ ਤੋਂ ਬਿਨਾਂ ਗਿਆਰਾਂ ਮਿੰਟ, ਫਿਰ 502 ਦੇ 30 ਸਕਿੰਟ। ਸਪਲਿਟ ਮਾਡਲ ਨੂੰ ਉਸੇ ਮਸ਼ੀਨਾਂ 'ਤੇ ਕੋਈ ਕਾਪੀ ਲੋਡ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੁਕਣਾ ਪਿਆ, ਇਸ ਲਈ ਸਾਡੇ ਏਜੰਟ ਲਗਭਗ ਗਿਆਰਾਂ ਮਿੰਟ ਇੰਤਜ਼ਾਰ ਕਰਦੇ ਰਹੇ। ਜਦੋਂ ਪਹਿਲੀ ਕਾਪੀ ਚਾਲੂ ਹੋਈ, ਤਾਂ ਪ੍ਰਾਕਸੀ ਨੇ ਲਗਭਗ 30 ਸਕਿੰਟ ਹੋਰ "502 no live upstreams" ਦਾ ਜਵਾਬ ਦਿੱਤਾ: ਇਸ ਨੇ ਬੈਕਐਂਡਸ ਨੂੰ ਡਾਊਨ ਹੋਣ ਦੌਰਾਨ ਫੇਲ੍ਹ ਮੰਨ ਲਿਆ ਸੀ (max_fails=3, fail_timeout=30s) ਅਤੇ ਉਸ ਸਮੇਂ ਦੇ ਖਤਮ ਹੋਣ ਤੱਕ ਉਹਨਾਂ ਨੂੰ ਦੁਬਾਰਾ ਟ੍ਰਾਈ ਨਹੀਂ ਕੀਤਾ।
  2. ਇੱਕ ਕਲਾਈਂਟ ਜਿਸਨੇ ਪ੍ਰਾਕਸੀ ਨੂੰ ਛੱਡ ਦਿੱਤਾ। ਸਾਡੇ ਇੱਕ ਬੈਚ ਜੌਬ ਦੇ ਕੌਂਫਿਗ ਵਿੱਚ ਪਹਿਲੀ ਮਸ਼ੀਨ ਦਾ ਪਤਾ ਸੀ, ਇਸਲਈ ਉਸਦਾ ਪੂਰਾ ਲੋਡ ਇੱਕ ਕਾਪੀ 'ਤੇ ਗਿਆ ਜਦੋਂ ਕਿ ਦੂਜੀ ਕੋਲ ਵਾਧੂ ਸਮਰੱਥਾ ਸੀ। ਹੁਣ ਹਰ ਕਲਾਈਂਟ ਪ੍ਰਾਕਸੀ ਰਾਹੀਂ ਜਾਂਦਾ ਹੈ; ਮਸ਼ੀਨਾਂ ਦੇ ਆਪਣੇ ਪਤੇ ਸਿਰਫ਼ ਹੈਲਥ ਚੈੱਕਸ ਲਈ ਹਨ।
  3. ਉਹ ਮੈਟ੍ਰਿਕਸ ਜੋ ਉਛਲੇ। ਸਾਡਾ ਥਰੂਪੁੱਟ ਮਾਨੀਟਰ ਪ੍ਰਾਕਸੀ ਰਾਹੀਂ vLLM ਦੇ /metrics ਨੂੰ ਪੜ੍ਹਦਾ ਸੀ। ਦੋ ਬੈਕਐਂਡਸ ਦੇ ਨਾਲ, ਲਗਾਤਾਰ ਪੜ੍ਹਨ ਵੱਖ-ਵੱਖ ਕਾਪੀਆਂ ਤੋਂ ਆਉਂਦੇ ਸਨ, ਕਾਊਂਟਰ ਅੱਗੇ-ਪਿੱਛੇ ਉਛਲਦੇ ਸਨ, ਅਤੇ ਮਾਨੀਟਰ ਮਾਡਲ ਨੂੰ ਸਟਾਰਵਡ (starved) ਦੱਸਦਾ ਸੀ। ਹੁਣ ਇਹ ਹਰ ਕਾਪੀ ਨੂੰ ਸਿੱਧਾ ਪੜ੍ਹਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਜੋੜਦਾ ਹੈ।
  4. ਇੱਕ ਪੁਰਾਣਾ ਵਾਚਡੌਗ ਜੋ ਨਵੀਂ ਕਾਪੀ ਨੂੰ ਰੋਕ ਸਕਦਾ ਸੀ। ਸਪਲਿਟ ਸੈੱਟਅੱਪ ਵਿੱਚ ਇੱਕ ਵਾਚਡੌਗ ਸੀ ਜੋ ਮਾਡਲ ਦੇ ਜਵਾਬ ਦੇਣਾ ਬੰਦ ਕਰਨ 'ਤੇ ਆਪਣੀ ਸੇਵਾ ਨੂੰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰ ਦਿੰਦਾ ਸੀ। ਨਵੀਂ ਸੇਵਾ ਪੁਰਾਣੀ ਵਾਲੀ ਨਾਲ Conflicts= ਘੋਸ਼ਿਤ ਕਰਦੀ ਹੈ, ਇਸ ਲਈ ਉਹ ਰੀਸਟਾਰਟ ਨਵੀਂ ਕਾਪੀ ਨੂੰ ਰੋਕ ਸਕਦਾ ਸੀ। ਇਸ ਨੂੰ ਸਿਰਫ਼ ਰੋਕਣ ਦੀ ਬਜਾਏ systemctl disable --now ਨਾਲ ਬੰਦ ਕਰਨਾ ਪਿਆ, ਕਿਉਂਕਿ ਸਾਡਾ ਓਪਸ ਲੇਅਰ ਉਹਨਾਂ ਯੂਨਿਟਸ ਨੂੰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰ ਦਿੰਦਾ ਹੈ ਜੋ ਇਨੇਬਲਡ ਹਨ ਪਰ ਚੱਲ ਨਹੀਂ ਰਹੇ।
  5. ਉਸ ਮਸ਼ੀਨ 'ਤੇ ਮੈਮੋਰੀ ਜੋ ਹੋਰ ਕੰਮ ਵੀ ਕਰਦੀ ਹੈ। ਇੱਕ ਮਸ਼ੀਨ ਸਾਡੇ ਡੇਟਾਬੇਸ ਅਤੇ ਸਾਈਟ ਬਿਲਡ ਵੀ ਚਲਾਉਂਦੀ ਹੈ। vLLM ਦੇ gpu-memory-utilization ਨੂੰ 0.78 'ਤੇ ਰੱਖਣ ਨਾਲ, ਬਾਕੀ ਸਾਰੇ ਕੰਮਾਂ ਲਈ ਸਿਰਫ਼ 5 GiB ਬਚੇ ਸਨ, ਇਸ ਲਈ ਅਸੀਂ ਇਸ ਨੂੰ 0.74 'ਤੇ ਘਟਾ ਦਿੱਤਾ ਅਤੇ ਸਿਰਫ਼ ਉਸੇ ਕਾਪੀ ਨੂੰ ਰੀਸਟਾਰਟ ਕੀਤਾ ਜਦੋਂ ਕਿ ਦੂਜੀ ਕਾਪੀ ਲੋਡ ਸੰਭਾਲ ਰਹੀ ਸੀ। ਇਹਨਾਂ ਮਸ਼ੀਨਾਂ 'ਤੇ, ਤੁਸੀਂ vLLM ਨੂੰ ਜਿੰਨੀ ਮੈਮੋਰੀ ਦਿੰਦੇ ਹੋ, ਉਹ ਬਾਕੀ ਸਾਰੇ ਕੰਮਾਂ ਵਾਲੀ ਮੈਮੋਰੀ ਵਿੱਚੋਂ ਹੀ ਆਉਂਦੀ ਹੈ।

ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਇਹਨਾਂ ਵਿੱਚੋਂ ਦੋ ਮਸ਼ੀਨਾਂ ਹਨ

Factory Floor ਇੱਕ ਜਾਂ ਦੋ ਮਸ਼ੀਨਾਂ ਲਈ proxy ਅਤੇ launch configs, ਹੈਲਥ ਚੈੱਕ ਅਤੇ ਮਾਡਲ ਬਦਲਣ ਤੋਂ ਪਹਿਲਾਂ ਚਲਾਈ ਜਾਣ ਵਾਲੀ tool-use ਟੈਸਟ, ਨਾਲ ਹੀ ਬਾਕੀ ਮਸ਼ੀਨ ਲਈ ਵਾਚਡੌਗ ਅਤੇ ਮੈਮੋਰੀ ਗਾਰਡ ਲੈ ਕੇ ਆਉਂਦਾ ਹੈ।

ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ: