
এই প্রকল্পটি কী করে
এই ডিপ্লয়মেন্ট রেসিপিটি দুটি NVIDIA DGX Spark থেকে DeepSeek-V4.1-Flash-1017 পরিবেশন করে; প্রতিটির ইউনিফায়েড মেমরি 128 GB। এটি TensorFold-এর নেটিভ Zig ইঞ্জিন ব্যবহার করে, প্রতিটি Spark-এ একটি করে র্যাঙ্ক রেখে টেনসর প্যারালেলিজম চালায় এবং 8888 পোর্টে OpenAI-সামঞ্জস্যপূর্ণ API প্রকাশ করে।
সেটআপটি পরীক্ষামূলক 2.9-বিট EXL3 চেকপয়েন্ট Mia-AiLab/DeepSeek-V4.1-Flash-1017-EXL3-EAQ-v1-2.9-bpw ব্যবহার করে। এটি মডেলের বড় কনটেক্সট উইন্ডো, ইমেজ ইনপুট, টুল কলিং, ঐচ্ছিক থিংকিং এবং চেকপয়েন্টের ড্রাফট ব্লক থেকে DSpark স্পেকুলেটিভ ডিকোডিং সমর্থন করে।
রিপোজিটরিটি প্রস্তুতি, Docker ইমেজ তৈরি, চেকপয়েন্ট ডাউনলোড, র্যাঙ্ক-ক্যাশ তৈরি, কর্মী সেটআপ, সার্ভার চালু, স্মোক টেস্ট এবং বন্ধ করার কাজ স্বয়ংক্রিয় করে। প্রথম Spark হেড হিসেবে কাজ করে: এটি API চালায়, সেটআপ সমন্বয় করে এবং র্যাঙ্ক 0 শুরু করে। দ্বিতীয় Spark র্যাঙ্ক 1 চালায়।
আর্কিটেকচার ও গুরুত্বপূর্ণ সীমাবদ্ধতা
TensorFold BertholomusAI-এর dsv41 পরিবারকে দুই সেট করা টেনসর প্যারালেলিজমে চালায়। দুটি র্যাঙ্ক সরাসরি ConnectX-7 লিংকের মাধ্যমে যোগাযোগ করে। হেড API ট্র্যাফিক গ্রহণ করে, আর উভয় Spark মেমরিতে প্রায় 98 GiB করে মডেল ওজন ধরে রাখে।
চেকপয়েন্টটির আকার আনুমানিক 196 GiB এবং এটি 39টি শার্ডে বিভক্ত। ডিপ্লয়মেন্টের জন্য Engram-এর দুটি আনকোয়ান্টাইজড টেবিলও প্রয়োজন, যেগুলোর আকার প্রায় 203 GB। উভয় Spark-এর স্থানীয় ডিস্কে Engram টেবিল কপি করা উচিত। NFS-এর মাধ্যমে এগুলো পড়লে প্রিফিল ও ডিকোডের কর্মক্ষমতা উল্লেখযোগ্যভাবে কমে যেতে পারে, কারণ ডিকোডিংয়ে অনেক র্যান্ডম 4 KiB রিড হয়।
মডেলটি প্রযুক্তিগতভাবে 1,048,576-টোকেন উইন্ডো ব্যবহার করতে পারে, কিন্তু হেডে উপলভ্য মেমরিই বাস্তব সীমা। অন্যান্য ডেস্কটপ ও ডেভেলপমেন্ট সার্ভিস চালানো হেডে, আরও মেমরি খালি না করা পর্যন্ত README-তে CONTEXT সর্বোচ্চ 524288 রাখার পরামর্শ দেওয়া হয়েছে।
হার্ডওয়্যার ও সফটওয়্যারের প্রয়োজনীয়তা
- দুটি NVIDIA DGX Spark বা সমমানের GB10 সিস্টেম, প্রতিটির 128 GB ইউনিফায়েড মেমরি।
- ConnectX-7 পোর্টগুলোর মধ্যে একটি সরাসরি QSFP সংযোগ।
- সরাসরি লিংকে IPv4 ঠিকানা, সচল কানেক্টিভিটি এবং একটি RoCE v2 GID।
- উভয় সিস্টেমে একই GPU ক্লক সীমা। README-তে
nvidia-smi -q -d CLOCKদিয়ে ক্লক পরীক্ষা করার এবং প্রয়োজন হলেnvidia-smi -lgc 0,2200ব্যবহারের পরামর্শ দেওয়া হয়েছে। - হেড থেকে কর্মী সিস্টেমে কী-ভিত্তিক SSH।
- উভয় সিস্টেমে NVIDIA container runtime-সহ Docker এবং আপনার ব্যবহারকারীকে
dockerগ্রুপে যুক্ত করা। - হেডে
git,python3এবং Hugging Face CLI। - চেকপয়েন্ট, Engram টেবিল, র্যাঙ্ক ওজন ফাইল, Docker ইমেজ এবং ক্যাশের জন্য পর্যাপ্ত স্টোরেজ। প্রচলিত বিন্যাসে হেডে আনুমানিক 505 GB এবং কর্মী সিস্টেমে আনুমানিক 310 GB প্রয়োজন।
সরাসরি লিংকটি প্রতিটি Spark-এ দুটি নেটওয়ার্ক ডিভাইস ও দুটি RoCE ডিভাইস হিসেবে দেখা যেতে পারে। উভয় রেলকে লিংকে ঠিকানা দিয়ে কনফিগার করুন এবং দুই সিস্টেমে একই MTU ব্যবহার করুন।
নেটওয়ার্ক ও SSH সংযোগ প্রস্তুত করুন
ConnectX-7 ইন্টারফেসগুলোতে ব্যক্তিগত সাবনেটের ঠিকানা নির্ধারণ করুন। উদাহরণ হিসেবে, README-তে 192.0.2.1/24 এবং 192.0.2.2/24-এর মতো ঠিকানা ব্যবহার করা হয়েছে। নির্ধারিত লিংকের মাধ্যমে দুটি সিস্টেম একে অপরকে ping করতে পারে কি না নিশ্চিত করুন।
হেডে কর্মী সিস্টেমের জন্য একটি SSH কী ইনস্টল করুন এবং ইন্টারঅ্যাকশন ছাড়া অ্যাক্সেস যাচাই করুন:
ssh-copy-id user@<worker>
ssh -o BatchMode=yes user@<worker> trueএকটি স্থানীয় কনফিগারেশন ফাইলে কর্মীর SSH টার্গেট ও ফ্যাব্রিক ঠিকানা নির্ধারণ করুন। কর্মী সিস্টেমে এই রিপোজিটরির কপি থাকা প্রয়োজন নেই।
NFS বা স্থানীয় স্টোরেজ কনফিগার করুন
ডিফল্টভাবে, কর্মী সিস্টেমটি হেডের Hugging Face ক্যাশকে NFS-এর মাধ্যমে শুধু-পাঠ্য হিসেবে মাউন্ট করে। হেডে NFS সার্ভার ইনস্টল করে ক্যাশ এক্সপোর্ট করুন:
sudo apt install nfs-kernel-server
echo "$HOME/.cache/huggingface <worker-CX7-address>(ro,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -raকর্মী সিস্টেমে হোস্টের NFS ক্লায়েন্ট সহায়ক, যেমন Ubuntu-তে nfs-common, প্রয়োজন হতে পারে। প্রস্তুতি স্ক্রিপ্টটি শুধু-পাঠ্য Docker NFS ভলিউম তৈরি করে এবং কর্মী সিস্টেম প্রয়োজনীয় ফাইলগুলো দেখতে পাচ্ছে কি না পরীক্ষা করে।
আরও ভালো বিচ্ছিন্নতার জন্য বা NFS উপযুক্ত না হলে, প্রতিটি Spark-এ প্রয়োজনীয় ক্যাশের একটি স্থানীয় কপি রাখুন। HF_CACHE-কে স্থানীয় ট্রিতে সেট করুন, NFS_VOLUME-কে সংশ্লিষ্ট হোস্ট পাথে সেট করুন, HEAD_NFS_SERVER খালি রাখুন এবং PREPARE=0 সেট করুন। স্থানীয় ক্যাশে চেকপয়েন্টের ছোট ফাইলগুলো, ভিশন শার্ড model-00039-of-00039, পরিবেশিত model/ ফোল্ডার, কিট, টোকেন ম্যাপ এবং উপযুক্ত র্যাঙ্ক ওজন ফাইল থাকতে হবে।
রিপোজিটরি ক্লোন ও কনফিগার করুন
হেডে রিপোজিটরি ক্লোন করে স্থানীয় কনফিগারেশন ফাইল তৈরি করুন:
git clone https://github.com/MiaAI-Lab/DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks.git
cd DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks
cp scripts/local.sh.example scripts/local.shscripts/local.sh সম্পাদনা করে অন্তত WORKER-এ কর্মীর SSH টার্গেট সেট করুন। কর্মীর SSH রুট সরাসরি ফ্যাব্রিক রুট থেকে আলাদা হলে, FABRIC_PEER-এ কর্মীর ConnectX-7 ঠিকানা সেট করুন।
বেশিরভাগ সেটিং scripts/config.sh-এ সংজ্ঞায়িত করা আছে। সাধারণ মানগুলোর মধ্যে রয়েছে:
- পিন করা EXL3 চেকপয়েন্টের জন্য
MODEL_IDএবংMODEL_REVISION। CONTEXT, যার ডিফল্ট মান1048576।PARALLEL, যার ডিফল্ট মান একই সময়ে চারটি অনুরোধ।- Hugging Face প্রমাণীকরণ প্রয়োজন হলে
HF_TOKEN। ABLIT, যা স্টক বা অ্যাবলিটারেটেড মোড নির্বাচন করে।
শুরু করার আগে ড্রাই রান পরীক্ষা করুন
কোনো পরিবর্তন না করে শনাক্ত করা লিংক ও Docker কমান্ডগুলো পরিদর্শন করতে ড্রাই-রান মোড ব্যবহার করুন:
DRY_RUN=1 ./start.shরিপোজিটরিটি প্রস্তুতির সময় শেল সিনট্যাক্স পরীক্ষা করে এবং প্রত্যাশিত নেটওয়ার্ক, Docker, GPU, SSH ও মেমরি শর্ত যাচাই করে। কনফিগার করা ন্যূনতম উপলভ্য মেমরি, MIN_AVAIL_GIB, উভয় Spark-এ না থাকলে স্টার্টআপ এগিয়ে যেতে অস্বীকার করে।
দুই-র্যাঙ্ক সার্ভার চালু করুন
হেড নোড থেকে সম্পূর্ণ ডিপ্লয়মেন্ট চালু করুন:
./start.shপ্রথমবার চালানোর সময় স্ক্রিপ্টটি TensorFold ইমেজ তৈরি করে, checkpoint ও Engram টেবিল ডাউনলোড করে, RoPE টেবিল ও image-routing ডেটা প্রস্তুত করে, token ও rank ফাইল তৈরি করে, worker-এর স্টোরেজ কনফিগার করে এবং উভয় rank চালু করে। Spark-এ Zig ইমেজ তৈরি করতে প্রায় ছয় মিনিট সময় লাগে এবং এতে প্রায় 24.9 GB-এর একটি ইমেজ তৈরি হয়।
স্টার্টআপের পর স্ক্রিপ্টটি API-এর জন্য অপেক্ষা করে এবং একটি smoke test চালায়। সফলভাবে চালু হলে DeepSeek-V4.1-Flash-1017 মডেলটি 8888 পোর্টে সক্রিয় আছে বলে জানায়।
উপযোগী lifecycle কমান্ডগুলো হলো:
./start.sh restart
./stop.shকোনো serving setting পরিবর্তন করার পর restart ব্যবহার করুন। কনটেইনার সরানোর আগে stop স্ক্রিপ্টটি compressed log সংরক্ষণ করে এবং LOG_KEEP অনুযায়ী সর্বশেষ logগুলো রেখে দেয়।
OpenAI-সামঞ্জস্যপূর্ণ API কল করুন
ক্লায়েন্টদের হেডের ঠিকানা, /v1 path এবং সঠিক model identifier DeepSeek-V4.1-Flash-1017 ব্যবহার করা উচিত। উদাহরণস্বরূপ, একটি OpenAI-সামঞ্জস্যপূর্ণ Python client এভাবে কনফিগার করা যায়:
from openai import OpenAI
client = OpenAI(
base_url="http://<head-address>:8888/v1",
api_key="unused"
)
response = client.chat.completions.create(
model="DeepSeek-V4.1-Flash-1017",
messages=[
{"role": "user", "content": "Explain tensor parallelism briefly."}
],
max_tokens=512
)
print(response.choices[0].message.content)অনুরোধের মাধ্যমে thinking নিষ্ক্রিয় না করা হলে মডেল উত্তর দেওয়ার আগে চিন্তা করে। reasoning ও চূড়ান্ত উত্তরের জন্য যথেষ্ট max_tokens বরাদ্দ করুন, অথবা environment-এ প্রাসঙ্গিক thinking ও reasoning setting কনফিগার করুন।
টেক্সট, টুল, ছবি ও দীর্ঘ prompt যাচাই করুন
চালু endpoint যাচাই করার জন্য রিপোজিটরিতে validation utility রয়েছে:
python3 tools/validate.py http://<head-address>:8888 --model DeepSeek-V4.1-Flash-1017
API_URL=http://<head-address>:8888 python3 tools/toolcheck.pyValidation suite-এ text, thinking, tools, image input এবং long prompt অন্তর্ভুক্ত রয়েছে। README-তে বলা হয়েছে, রিপোর্ট করা hardware pair-এ image input ও validation tool সম্পূর্ণভাবে পরীক্ষা করা হয়নি। তাই এই testগুলোকে নিশ্চয়তা হিসেবে নয়, deployment check হিসেবে বিবেচনা করুন।
অতিরিক্ত diagnostics-এর জন্য rank log দেখুন:
docker logs -f dsv41-1017-exl3-tf
ssh <worker> docker logs -f dsv41-1017-exl3-tfAbliterated mode ব্যবহার করুন
ডিফল্ট কনফিগারেশনে stock Mia EAQ 2.9-bit checkpoint ব্যবহার করা হয়। ABLIT=1 সেট করলে ওই checkpoint-ই রাখা হয় এবং drowzeys/keys-DeepSeek-V4.1-Flash-1017-Abliterated থেকে matching Keys overlay প্রয়োগ করা হয়।
এটি একটি gated Hugging Face repository। Preparation-এর আগে repository-এর শর্ত গ্রহণ করুন এবং অ্যাক্সেস-সক্ষম account দিয়ে authenticate করুন:
hf auth login
ABLIT=1 ./scripts/prepare.sh
ABLIT=1 ./start.sh restartবিকল্পভাবে, shell history-তে না রেখে একটি token দিন:
read -rsp 'Hugging Face read token: ' HF_TOKEN; echo
export HF_TOKEN
ABLIT=1 ./start.sh restart
unset HF_TOKENOverlay-টি ABLIT_REVISION দ্বারা নির্দিষ্ট করা থাকে। Preparation আলাদা cache path ও rank cache তৈরি করে, যাতে stock এবং abliterated data ভুল করে মিশে না যায়। Rewritten shard-এর জন্য overlay ও rank file-এর অতিরিক্ত, আরেকটি checkpoint-এর সমপরিমাণ স্থান প্রয়োজন হতে পারে। এভাবে stock mode-এ ফিরে যান:
ABLIT=0 ./start.sh restartREADME-তে স্পষ্টভাবে বলা হয়েছে, stock performance ও correctness result এই engine-এ abliterated mode যাচাই করে না। Preparation এবং startup-এর সময় একই ABLIT setting রাখুন।
Performance ও tuning নির্দেশনা
বাস্তব prose ও code prompt দিয়ে করা পরিমাপে একটি prose stream-এর জন্য প্রায় 74.9 token per second এবং একটি code stream-এর জন্য 109.9 token per second পাওয়া গেছে। চারটি stream-এ prose-এর মোট throughput প্রায় 130.0 token per second এবং code-এর 155.5 token per second পর্যন্ত পৌঁছেছে। 8K থেকে 256K token-এর prompt জুড়ে prefill প্রায় 2,000 থেকে 2,180 token per second মাপা হয়েছে।
ফলাফল prompt-এর বিষয়বস্তু, GPU clock, concurrent workload, storage এবং memory pressure-এর ওপর নির্ভর করে। Random-word benchmark স্বাভাবিক prose বা code-এর তুলনায় কম কার্যকরভাবে draft করে, তাই তাদের কম decode figure-কে engine-এর সাধারণ সীমা হিসেবে বিবেচনা করা উচিত নয়।
- উভয় Spark-এ Engram table local disk-এ রাখুন।
- একই GPU clock ceiling ব্যবহার করুন, কারণ tensor-parallel rankগুলো বারবার synchronize করে।
- হেডে অন্য software চললে বিশেষভাবে,
CONTEXT-কে হেডের memory capacity-এর মধ্যে রাখুন। - দীর্ঘ prompt বা একাধিক concurrent user পরিবেশন করার সময়
PARALLELসতর্কতার সঙ্গে ব্যবহার করুন। - Networking বা deployment setting পরিবর্তনের আগে
DRY_RUN=1ব্যবহার করুন।
ঐচ্ছিক engine switch ও patch
রিপোজিটরিতে zig/patches/-এর অধীনে engine patch রয়েছে। এগুলো ডিফল্টভাবে বন্ধ থাকে এবং start.sh-এর মাধ্যমে উভয় rank-এ পাঠানো হয়। README-তে বলা হয়েছে, বিভিন্ন prompt ও concurrency scenario জুড়ে identical token hash-এর জন্য default image পরীক্ষা করা হয়েছে।
TF_DS_ENGRAM_LANES=2 সক্রিয় করলে Engram রিডের জন্য দ্বিতীয় I/O রিং চালু হয়, তবে পরিমাপে দেখা গেছে যে পরীক্ষিত স্টোরেজে এটি ধীর ছিল। TF_DS_IDX_SPLIT=1 র্যাঙ্কগুলোর মধ্যে prefill indexer সারিগুলো ভাগ করে, কিন্তু পরীক্ষিত জোড়ায় পরিমাপযোগ্য কোনো লাভ দেখা যায়নি। এই সেটিং নিয়ে র্যাঙ্কগুলোর মধ্যে মতভেদ থাকলে জোড়াটি আটকে যেতে পারে, তাই এটি ডিফল্টভাবে নিষ্ক্রিয় থাকে।
প্যাচ 0005 prompt-pass interleaving উন্নত করে, যাতে অন্য একটি দীর্ঘ prompt prefetch হওয়ার সময় বিদ্যমান stream-গুলো decode round পায়। এর আচরণ PREFILL_INTERLEAVE_MS দিয়ে সমন্বয় করা যায়। প্যাচ 0006 image input-এর জন্য prompt state সংরক্ষণ করে, যদি TF_DS_IMAGE_CACHE=0 ব্যবহার করে এই আচরণ নিষ্ক্রিয় না করা হয়।
মেমরি পর্যবেক্ষণ করুন এবং অনিরাপদ context size এড়িয়ে চলুন
মেমরিই প্রধান পরিচালনাগত সীমাবদ্ধতা। README-তে বলা হয়েছে, অন্য সফটওয়্যার প্রায় 6 GiB মেমরি ব্যবহার করছে এমন একটি head-এ 512K context ব্যবহারিক ছিল, তবে কথোপকথন বাড়ার সঙ্গে 655K configuration memory guard-এর নিচে নেমে যেতে পারে। ভারী ও সমসাময়িক দীর্ঘ prompt চলাকালে memory floor-এ পৌঁছালে Spark স্থবির হয়ে যেতে পারে, তাই একটি watchdog অন্তর্ভুক্ত করা হয়েছে।
ডিফল্ট বা সংযত CONTEXT মান দিয়ে শুরু করুন, আপনার প্রকৃত workload দিয়ে পরীক্ষা করুন এবং দীর্ঘ conversation history চলাকালে ফাঁকা মেমরি পর্যবেক্ষণ করুন। মডেল সফলভাবে লোড হলেও cached conversation বাড়ার সঙ্গে ফাঁকা মেমরি কমে যেতে পারে।
উপসংহার
এই repository দুটি সরাসরি সংযুক্ত DGX Spark জুড়ে DeepSeek-V4.1-Flash-1017 বিতরণের একটি স্বয়ংক্রিয় উপায় প্রদান করে। হার্ডওয়্যার, RoCE networking, SSH, Docker, storage এবং Hugging Face access প্রস্তুত থাকলে start.sh বহু-ধাপের setup পরিচালনা করে এবং পরিচিত OpenAI-compatible endpoint উন্মুক্ত করে।
নির্ভরযোগ্য deployment-এর জন্য local Engram storage, সামঞ্জস্যপূর্ণ GPU clock, সংযত context sizing এবং image, tool ও long-context workload-এর সতর্ক validation-কে অগ্রাধিকার দিন। Abliterated overlay এবং engine switch পরীক্ষামূলক ব্যবহারের জন্য উপলব্ধ, তবে নথিভুক্ত performance ও correctness পরিমাপ মূলত stock checkpoint এবং default engine configuration-এর ক্ষেত্রে প্রযোজ্য।
