মূল কনটেন্টে যান
এআই টিউটোরিয়াল

vLLM ও Pi দিয়ে দুইটি DGX Spark-এ DeepSeek-V4.1-Flash পরিবেশন

এই টিউটোরিয়ালে দুইটি NVIDIA DGX Spark নোডে EXL3-কোয়ান্টাইজড DeepSeek-V4.1-Flash চেকপয়েন্ট ডিপ্লয়, RoCE টেনসর প্যারালেলিজম কনফিগার, OpenAI-সামঞ্জস্যপূর্ণ API যাচাই এবং মডেলটিকে Pi কোডিং এজেন্টের সঙ্গে সংযুক্ত করার পদ্ধতি ব্যাখ্যা করা হয়েছে।

vLLM ও Pi দিয়ে দুইটি DGX Spark-এ DeepSeek-V4.1-Flash

আপনি যা তৈরি করবেন

এই প্রকল্পে DeepSeek-V4.1-Flash মডেলটি vLLM ব্যবহার করে দুটি NVIDIA DGX Spark নোডে পরিবেশনের জন্য স্ক্রিপ্ট রয়েছে। নোড দুটির মধ্যে QSFP/RoCE লিংকের মাধ্যমে টেনসর প্যারালেলিজম চালানো হয়, আর হেড নোডটি 8000 পোর্টে OpenAI-সামঞ্জস্যপূর্ণ API প্রকাশ করে।

ডিপ্লয়মেন্টে 0xSero/DeepSeek-V4.1-Flash-Spark চেকপয়েন্ট ব্যবহার করা হয়েছে। রাউটেড ব্যাকবোন এক্সপার্টগুলো EXL3 ট্রেলিস ডেটা হিসেবে এনকোড করা এবং প্রতি ওজনে রিপোর্ট করা গড় 2.77 বিট। অ্যাটেনশন, শেয়ার্ড এক্সপার্ট, রাউটার, Engram টেবিল, ড্রাফট লেয়ার, ভিশন কম্পোনেন্ট, এমবেডিং এবং আউটপুট হেড আপস্ট্রিম চেকপয়েন্ট থেকেই রাখা হয়েছে।

ডিপ্লয়মেন্টের পর আপনি সরাসরি এর API-এর মাধ্যমে মডেলটি ব্যবহার করতে পারবেন, অথবা কোডিং ও টুল-সহায়িত ওয়ার্কফ্লোর জন্য এটিকে Pi coding agent-এর সঙ্গে সংযুক্ত করতে পারবেন।

পারফরম্যান্স ও সক্ষমতা

README-তে RoCE-এর মাধ্যমে টেনসর প্যারালেলিজম, FP8 KV ক্যাশে, সাত-টোকেন DSpark স্পেকুলেটিভ ডিকোডিং, ডিস্ক-ব্যাকড Engram টেবিল এবং দুটি সমান্তরাল সিকোয়েন্স ব্যবহার করে দুটি DGX Spark GB10 নোড থেকে নেওয়া পরিমাপের ফলাফল দেওয়া হয়েছে।

  • 8k প্রম্পট প্রিফিল: প্রায় 2,050 টোকেন প্রতি সেকেন্ডে।
  • 32k প্রম্পট প্রিফিল: প্রায় 2,061 টোকেন প্রতি সেকেন্ডে।
  • কোড ডিকোডিং: একটি স্ট্রিমে প্রায় 39–41 টোকেন প্রতি সেকেন্ডে।
  • দুই-স্ট্রিম কোড ডিকোডিং: মোট 60 টোকেন প্রতি সেকেন্ডে।
  • গদ্য ডিকোডিং: একটি স্ট্রিমে প্রায় 29 টোকেন প্রতি সেকেন্ডে।
  • প্রতি অনুরোধে সর্বোচ্চ কনটেক্সট: 262,144 টোকেন।
  • KV ক্যাশ পুল: 2,023,717 টোকেন।
  • ভিশন ইনপুট, টুল কল এবং রিজনিং: সফলভাবে স্মোক-টেস্ট করা হয়েছে।
  • 175k-টোকেন কনটেক্সট রিকল: রিপোর্ট করা ছয়টি ল্যাব গেটই পাস করেছে।

প্রথমবার বুট হতে প্রায় 11–13 মিনিট লাগে, কারণ ওজন ও EXL3 ব্যাংক লোড করা, কার্নেল কম্পাইল করা এবং CUDA গ্রাফ ক্যাপচার করা হয়।

পূর্বশর্ত

আপনার DGX OS চালিত দুটি DGX Spark নোড প্রয়োজন। একটিকে হেড হিসেবে নির্বাচন করুন, যেটি API পরিবেশন করবে, আর অন্যটিকে ওয়ার্কার হিসেবে নির্বাচন করুন।

  • নোড দুটিকে সংযুক্ত করার জন্য একটি QSFP কেবল, যেখানে RoCE সক্রিয়।
  • প্রতিটি নোডে অন্তত একটি RDMA পোর্ট ACTIVE অবস্থায় থাকতে হবে, যা rdma link দিয়ে যাচাই করা যায়।
  • প্রতিটি নোডের সংশ্লিষ্ট ফ্যাব্রিক নেটওয়ার্কে একটি IPv4 ঠিকানা, যেমন 10.10.10.13 এবং 10.10.10.11।
  • ওয়ার্কারের ফ্যাব্রিক ঠিকানা ব্যবহার করে হেড থেকে পাসওয়ার্ডবিহীন SSH।
  • উভয় নোডে NVIDIA রানটাইমসহ Docker ইনস্টল করা থাকতে হবে।
  • আপনার ব্যবহারকারীকে docker গ্রুপের সদস্য হতে হবে।
  • হেডে প্রায় 700 GB এবং ওয়ার্কারে 470 GB খালি NVMe স্থান।
  • উভয় নোডে python3, rsync এবং curl।
  • যে মেশিনে Pi চলবে সেখানে Node.js এবং npm।

রিপোজিটরি ক্লোন করুন এবং ওয়ার্কার নির্ধারণ করুন

হেড নোডে নিচের কমান্ডগুলো চালান। SSH টার্গেটটি ওয়ার্কারের ফ্যাব্রিক ঠিকানা দিয়ে প্রতিস্থাপন করুন।

git clone https://github.com/0xSero/DeepSeek-V4.1-Flash-Two-Sparks
cd DeepSeek-V4.1-Flash-Two-Sparks
export WORKER=user@10.10.10.11

দ্বিতীয় Spark-এ সংযোগ করতে স্ক্রিপ্টগুলো WORKER ব্যবহার করে। এগিয়ে যাওয়ার আগে SSH কী-ভিত্তিক প্রমাণীকরণ কাজ করছে কি না নিশ্চিত করুন।

চেকপয়েন্ট ডাউনলোড ও বিতরণ করুন

হেডের ডিফল্ট মডেল ডিরেক্টরিতে প্রায় 462 GB-এর চেকপয়েন্ট ডাউনলোড করুন:

scripts/download.sh

ডাউনলোড স্ক্রিপ্টটি Engram শার্ডগুলোও পুনর্গঠন করে। Hugging Face পৃথক ফাইলের আকার 50 GB-এ সীমাবদ্ধ রাখায় দুটি নেটিভ শার্ড .partNN ফাইল হিসেবে সংরক্ষিত থাকে। স্ক্রিপ্টটি এগুলো পুনর্গঠন করে, ছয়টি নেটিভ শার্ড sha256-manifest.txt-এর বিরুদ্ধে যাচাই করে এবং পার্ট ফাইলগুলো মুছে দেয়। এগুলো রাখতে চাইলে KEEP_PARTS=1 সেট করুন।

ফ্যাব্রিকের মাধ্যমে সম্পূর্ণ মডেলটি ওয়ার্কারে কপি করুন:

scripts/copy-to-peer.sh

বিকল্প হিসেবে, ওয়ার্কারেও সরাসরি scripts/download.sh চালাতে পারেন। ডিফল্ট মডেল পাথ হলো ~/models/DeepSeek-V4.1-Flash-Spark। ওয়ার্কার অন্য কোনো পাথ ব্যবহার করলে চালু করার আগে WORKER_MODEL_DIR কনফিগার করুন।

সার্ভিং ইমেজ টানুন

প্রকল্পটি EXL3 mixture-of-experts পাথ এবং B12X Spark কার্নেলসমৃদ্ধ একটি vLLM ইমেজ ব্যবহার করে। উভয় নোডে নির্দিষ্ট ইমেজটি টানুন:

docker pull ghcr.io/0xsero/deepseek-v4.1-flash-spark@sha256:5668e35e5ee021da4b9ce88a1964caf0e082e8ca01d81d1d64b6213a55c6add5

ইমেজটি আগে থেকে উপলভ্য না থাকলে লঞ্চ স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে সেটি টেনে নেয়, তাই স্টার্টআপের সময়ও এই ধাপ সম্পন্ন করা যায়।

উভয় টেনসর-প্যারালেল র‍্যাঙ্ক চালু করুন

হেড থেকে দুই-নোড সার্ভারটি চালু করুন:

scripts/launch.sh

লঞ্চার সক্রিয় ফ্যাব্রিক ইন্টারফেস শনাক্ত করে, ~/.dsv41-two-sparks/api_key-এ একটি API কী তৈরি করে, উভয় নোডে মেমরি গার্ড চালু করে, ওয়ার্কারে র‍্যাঙ্ক 1 এবং হেডে র‍্যাঙ্ক 0 চালু করে। এটি API উপলভ্য হওয়া পর্যন্ত অপেক্ষা করে এবং স্টার্টআপের জন্য সর্বোচ্চ 45 মিনিট সময় দেয়।

ডিপ্লয়মেন্ট পরিদর্শন বা পরিচালনার জন্য একই স্ক্রিপ্ট ব্যবহার করুন:

scripts/launch.sh status
scripts/launch.sh logs r0
scripts/launch.sh logs r1
scripts/launch.sh stop

সার্ভারটি হেডে স্থানীয়ভাবে http://127.0.0.1:8000-এ শোনে। ক্লায়েন্টরা হেডের সংযোগযোগ্য ঠিকানা ব্যবহার করতে পারে, তবে র‍্যাঙ্ক-টু-র‍্যাঙ্ক ট্রাফিককে অবশ্যই QSFP/RoCE ফ্যাব্রিক ব্যবহার করতে হবে।

স্মোক টেস্ট চালান

টেক্সট জেনারেশন, টুল কল এবং ভিশন ইনপুট যাচাই করতে চালান:

python3 scripts/smoke.py http://127.0.0.1:8000

প্রতিটি যাচাই PASS অথবা FAIL দেখায়। আপনি ঐচ্ছিক বেঞ্চমার্কও চালাতে পারেন:

python3 scripts/bench.py --out bench.json --conc 1 2

এই বেঞ্চমার্কটি কোনো আউটপুট সীমা আরোপ না করে prefill, decode এবং দীর্ঘ-কনটেক্সটের গতি পরিমাপ করে।

OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্ট ব্যবহার করুন

সার্ভারটি নিম্নলিখিত API তথ্য প্রকাশ করে:

  • বেস URL: http://<head-ip>:8000/v1
  • মডেলের নাম: deepseek-v4.1-flash
  • প্রমাণীকরণ: ~/.dsv41-two-sparks/api_key থেকে bearer token

উদাহরণস্বরূপ, head থেকে কী আনতে ব্যবহার করুন:

ssh <head> cat ~/.dsv41-two-sparks/api_key

এরপর বেস URL, মডেলের নাম এবং bearer key কনফিগার করে যেকোনো OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্টের মাধ্যমে এন্ডপয়েন্টটি ব্যবহার করতে পারবেন।

Pi-কে মডেলের সঙ্গে সংযুক্ত করুন

Node.js ও npm থাকা কোনো মেশিনে Pi provider ইনস্টল ও নিবন্ধন করুন। কমান্ডটি চূড়ান্ত model path ছাড়া API base URL গ্রহণ করে:

pi/install.sh http://<head-ip>:8000/v1

Pi চালু করবে যে shell-এ, সেখানে API key সেট করুন:

export DSV41_API_KEY=$(ssh <head> cat ~/.dsv41-two-sparks/api_key)
pi --model dsv41-sparks/deepseek-v4.1-flash

আপনার PATH-এ Pi আগে থেকে না থাকলে installer এটি ইনস্টল করে। এরপর Pi-এর model configuration-এ শুধু dsv41-sparks provider যোগ বা প্রতিস্থাপন করে। আগে timestamp-যুক্ত backup তৈরি করে এবং অন্য provider-গুলো অপরিবর্তিত রাখে।

আপনি যদি enabledModels তালিকা ব্যবহার করেন, installer এতে পরিবেশিত মডেলটি যোগ করে। এই মডেলকে Pi-এর startup model করতে SET_DEFAULT=1 সেট করুন।

ইনস্টল করা extension এই provider-এর জন্য Pi-এর output-token সীমা সরিয়ে দেয়, ফলে response স্বাভাবিকভাবে শেষ হতে পারে। এটি request-এর সময় DSV41_API_KEY পড়ে এবং key-টি Pi-এর configuration-এ লেখে না।

ডিফল্ট কনফিগারেশন বুঝুন

scripts/launch.sh দিয়ে পরিমাপ করা serving configuration পুনরুৎপাদন করা হয়। গুরুত্বপূর্ণ সেটিংসের মধ্যে রয়েছে:

  • KV_BYTES=2700000000-সহ FP8 KV cache।
  • 262144 token-এর সর্বোচ্চ context length।
  • সর্বোচ্চ দুইটি concurrent sequence।
  • সর্বোচ্চ batched token 2048 নির্ধারিত।
  • সাতটি draft token ও adaptive verification-সহ DSpark speculative decoding।
  • ডিস্ক-সমর্থিত Engram table।
  • B12X attention, linear ও MoE kernel।
  • ST_EXL3_PREFILL=st-সহ EXL3 routed expert।
  • FULL_DECODE_ONLY CUDA graph।
  • B12X RoCE one-shot all-reduce এবং বাকি distributed operation-এর জন্য NCCL over RoCE।
  • প্রতিটি multimodal prompt-এর জন্য একটি image।
  • deepseek_v41 reasoning ও tool-call parser।

বেশিরভাগ সেটিংস environment variable-এর মাধ্যমে override করা যায়। মডেল directory MODEL_DIR, worker-এর model directory WORKER_MODEL_DIR, এবং persistent runtime data STATE_DIR দ্বারা নিয়ন্ত্রিত হয়। ডিফল্ট state directory হলো ~/.dsv41-two-sparks।

Launcher মডেলটি /model-এ read-only হিসেবে mount করে। এটি EXL3 allocation plan-টি state directory-তে কপি করে এবং mounted EXL3 directory-গুলোর দিকে নির্দেশ করার জন্য এর bank path পুনর্লিখন করে।

সঠিক নেটওয়ার্কে ট্রাফিক রাখুন

vLLM, NCCL ও Gloo process-গুলোকে Wi-Fi, Ethernet বা Tailscale interface-এর বদলে QSFP/RoCE address-এ bind করতে হবে। Launcher সাধারণত সক্রিয় RoCE port শনাক্ত করে এবং নিম্নলিখিত ধরনের variable সেট করে:

  • VLLM_HOST_IP
  • NCCL_SOCKET_IFNAME
  • GLOO_SOCKET_IFNAME
  • NCCL_IB_HCA

স্বয়ংক্রিয় শনাক্তকরণ ভুল interface নির্বাচন করলে HEAD_IP, WORKER_IP, HEAD_IFNAME, WORKER_IFNAME, HEAD_HCAS বা WORKER_HCAS স্পষ্টভাবে সেট করুন। সঠিক address ও RDMA device শনাক্ত করতে ip -br a এবং rdma link ব্যবহার করুন।

নিরাপদে মেমরি পরিচালনা করুন

একটি DGX Spark CPU ও GPU-এর মধ্যে 128 GB memory pool ভাগ করে। available memory শূন্যে পৌঁছালে container পরিষ্কারভাবে বন্ধ না হয়ে host সাড়া দেওয়া বন্ধ করতে পারে। available memory কনফিগার করা সীমার নিচে নামলে container dsv41-r* বন্ধ করার জন্য launcher উভয় node-এ scripts/memguard.sh চালু করে।

Memory guard log দেখুন:

~/.dsv41-two-sparks/memguard.log

ডিফল্ট configuration-এ steady-state available memory আনুমানিক 2–3 GiB হিসেবে রিপোর্ট করা হয়। Guard সক্রিয় হলে MEMGUARD_GIB বাড়ানোর আগে KV_BYTES বা GPU_UTIL কমান।

সাধারণ সমস্যা সমাধান

Startup ধীর

প্রথম boot-এ weights load, EXL3 bank প্রস্তুত, B12X kernel compile এবং CUDA graph capture হওয়ার সময় প্রায় 12 মিনিট লাগতে পারে। Kernel cache STATE_DIR/cache-এর অধীনে সংরক্ষিত হয়, তাই পরবর্তী launch দ্রুত হতে পারে।

Engram file পাওয়া যাচ্ছে না

Startup-এ model-00005-of-00006.safetensors-এর মতো কোনো file না পাওয়ার কথা জানালে Engram shard সম্ভবত পুনরায় একত্র করা হয়নি। আবার scripts/download.sh চালান। এটি অসম্পূর্ণ কাজ চালু রাখে এবং সম্পন্ন ধাপগুলো এড়িয়ে যায়।

Fabric detection ভুল interface বেছে নেয়

ip -br a দিয়ে address এবং rdma link দিয়ে RDMA state পরীক্ষা করুন। এরপর উপরে বর্ণিত head ও worker interface, IP এবং HCA variable-গুলো স্পষ্টভাবে দিন।

Download ধীর

কোনো Spark যদি শুধু Wi-Fi-এর মাধ্যমে internet-এ পৌঁছাতে পারে, তাহলে সবচেয়ে ভালো uplink থাকা node-এ checkpoint download করুন এবং fabric-এর মাধ্যমে scripts/copy-to-peer.sh ব্যবহার করুন।

Pi মডেল দেখতে পাচ্ছে না

Pi চালু করা একই shell-এ DSV41_API_KEY export করা আছে কি না নিশ্চিত করুন। Model list পুনরায় load করতে Pi-এর ভিতরে /model চালান।

Pi print mode অনির্দিষ্টকাল অপেক্ষা করে

স্ট্যান্ডার্ড ইনপুট কোনো টার্মিনাল না হলে, pi -p stdin থেকেও পড়ে। স্ক্রিপ্টে stdin-কে /dev/null থেকে রিডাইরেক্ট করুন:

pi -p < /dev/null

উপসংহার

এই রিপোজিটরিতে DeepSeek-V4.1-Flash দুটি DGX Sparks-এ চালানোর জন্য প্রয়োজনীয় মডেল, সার্ভিং ইমেজ, ডিস্ট্রিবিউটেড লঞ্চ স্ক্রিপ্ট, মেমরি সুরক্ষা, ভ্যালিডেশন টুল এবং Pi ইন্টিগ্রেশন প্যাকেজ করা হয়েছে। RoCE ফ্যাব্রিক প্রস্তুত করুন, উভয় নোডে চেকপয়েন্ট ডাউনলোড ও যাচাই করুন, দুটি র‍্যাঙ্ক চালু করুন, স্মোক টেস্ট চালান, তারপর সামঞ্জস্যপূর্ণ ক্লায়েন্ট বা Pi-কে হেড নোডের OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টে নির্দেশ করুন।